1

この記事を読んで、Decorator の例に取り組みました。<strong></strong>期待されるのではなく、コードが返され<strong><a href="logout.php">Logout</a></strong>ます。

class HtmlLinks {
//some methods which is available to all html links
}

class LogoutLink extends HtmlLinks 
{
protected $_html;

public function __construct() {
$this->_html = "<a href=\"logout.php\">Logout</a>";
}

public function setHtml($html) {
$this->_html = $html;
}

public function render() {
    echo $this->_html;
}
}


class LogoutLinkStrongDecorator extends HtmlLinks {
   protected $_logout_link;

    public function __construct( $logout_link ) {
    $this->_logout_link = $logout_link;
    $this->setHtml("<strong>" . $this->_html . "</strong>");
    }

    public function __call( $name, $args ) {
    $this->_logout_link->$name($args[0]);
    }
}

$logout_link = new LogoutLink();

$logout_link = new LogoutLinkStrongDecorator($logout_link);
$logout_link->render();

午後中ずっとデバッグしようとしましたが、何の前進もありませんでした。任意の洞察をいただければ幸いです。

4

2 に答える 2

0

デコレータ パターン:

  1. Decorator と Decorated Object は同じインターフェースを実装します。
  2. Decorator は、コンストラクターで共有インターフェイスを実装するオブジェクトを受け取ります。

デコレータが装飾するクラスから継承する必要は必ずしもありません。使用しているコンテキストで必要なメソッド (この場合は "render()") を実装することだけを気にします。これは、インターフェイスを使用して強制できます。継承を使用する利点は、他のすべてのメソッドが引き続き呼び出し可能であることが保証され、渡したクラスのインスタンスも返されることです。

コード:

interface Renderable
{
    public function render();
}

class HtmlLink implements Renderable
{
    public function render()
    {
        return '<a href="'.$this->href.'">'.$this->anchorText.'</a>';
    }
    // other link methods...
}

class StrongRenderableDecorator implements Renderable
{
    protected $renderable;
    public function __construct(Renderable $renderable)
    {
        $this->renderable = $renderable;
    }
    public function render()
    {
        return '<strong>'.$this->renderable->render().'</strong>';
    }
}

$logout_link = new StrongRenderableDecorator(new LogoutLink());
$logout_link->render();
于 2013-07-30T08:41:53.990 に答える