<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                裝飾(Decorator)模式:動態地給(具體構建的)對象增加一些職責,即在原有的基礎上增加其額外的功能。 **主要優點有:** * 采用裝飾模式擴展對象的功能比采用繼承方式更加靈活。 * 可以設計出多個不同的具體裝飾類,創造出多個不同行為的組合。 **主要缺點是:** 裝飾模式增加了許多子類,如果過度使用會使程序變得很復雜。 特點:用來增強原有對象功能,依附于原有對象。 應用:用于需要對原有對象增加功能而不是完全覆蓋的時候 ## 裝飾模式的應用場景 其適用的應用場景,裝飾模式通常在以下幾種情況使用。 * 當需要給一個現有類添加附加職責,而又不能采用生成子類的方法進行擴充時。例如,該類被隱藏或者該類是終極(final)類或者采用繼承方式會產生大量的子類。 * 當需要通過對現有的一組基本功能進行排列組合而產生非常多的功能時,采用繼承關系很難實現,而采用裝飾模式卻很好實現。 * 當對象的功能要求可以動態地添加,也可以再動態地撤銷時。 例:其中最常見的就是一些游戲開發商,通過去做一些裝備,例如武器,衣服,鞋子,戒指等等,來吸引玩家購買,穿在身上不僅好看,還帶有額外屬性。 #### 1\. 模式的結構 裝飾模式主要包含以下角色。 >[danger]將具體構建實例對象通過析構或者普通方法傳入具體裝飾類中 1. 抽象構件(Component)角色:定義一個抽象接口以規范準備接收附加責任的對象。 2. 具體構件(Concrete??? Component)角色:實現(implements)抽象構件,通過裝飾角色為其添加一些職責。 3. 抽象裝飾(Decorator)角色:繼承抽象構件,并包含具體構件的實例,可以通過其子類擴展具體構件的功能。 4. 具體裝飾(ConcreteDecorator)角色:實現抽象裝飾的相關方法,并給具體構件對象添加附加的責任。 ![](https://img.kancloud.cn/69/4d/694dd961ce5f4379466a88e9c118e7f4_525x540.png) ~~~ //抽象構建 interface Component { public function operation(); } //具體構建 class ConcreteComponent implements Component{ //具體組件類 public function operation() {} } //抽象裝飾 abstract class Decorator implements Component{ // 裝飾角色 protected $_component; public function __construct(Component $component) { $this->_component = $component; } public function operation() { $this->_component->operation(); } } //具體裝飾1 class ConcreteDecoratorA extends Decorator { // 具體裝飾類A public function __construct(Component $component) { parent::__construct($component); } public function operation() { parent::operation(); // 調用裝飾類的操作 $this->addedOperationA(); // 執行新增加的操作方法 } //添加新的抽象方法,上面在調用 public function addedOperationA() {echo 'A加點醬油;';} } //具體裝飾2 class ConcreteDecoratorB extends Decorator { // 具體裝飾類B public function __construct(Component $component) { parent::__construct($component); } public function operation() { parent::operation(); $this->addedOperationB(); } public function addedOperationB() {echo "B加點辣椒;";} } // clients $component = new ConcreteComponent(); $decoratorA = new ConcreteDecoratorA($component); $decoratorB = new ConcreteDecoratorB($decoratorA); $decoratorA->operation();//輸出:A加點醬油; echo '<br>--------<br>'; $decoratorB->operation();//輸出:A加點醬油;B加點辣椒; ~~~ 下面這個例子是典型裝飾器模式的應用,特點是在不影響其他類的情況下動態添加其它具體裝備類 ``` /** 構件接口類(抽象構件類) * interface IComponent */ interface IComponent { function Display(); } /** 人物類(具體構建類) * Person */ Class Person implements IComponent { private $name; function __construct($name) { $this->name = $name; } function Display() { echo "{$this->name}當前裝備:"; } } /** 裝備類(抽象裝飾) * Equipment */ Class Equipment implements IComponent { protected $component; function Decorator(IComponent $component) { // 動態添加 $this->component = $component; } function Display() { if(!empty($this->component)){ $this->component->Display(); } } } /** 具體裝備 武器類(具體裝飾) * Weapon */ Class Weapon extends Equipment { function Display(){ parent::Display(); echo "龍泉劍 "; } } /** 具體裝備 戒指類(具體裝飾) * Ring */ Class Ring extends Equipment { function Display(){ parent::Display(); echo "復活戒指 "; } } /** 具體裝備 鞋子類(具體裝飾) * Shoes */ Class Shoes extends Equipment { function Display(){ parent::Display(); echo "御風履 "; } } // 如果需要可以繼續添加具體的裝備 腰帶 褲子 手鐲 // 創建人物 $people = new Person("戰士"); // 武器 $Weapon = new Weapon(); // 戒指 $Ring = new Ring(); // 鞋子 $Shoes = new Shoes(); // 動態添加函數 $Weapon->Decorator($people); $Ring->Decorator($Weapon); $Shoes->Decorator($Ring); // 顯示 $Shoes->Display(); //輸出結果: 戰士當前裝備:龍泉劍 復活戒指 御風履 ``` 游戲角色變身 ``` //抽象構件角色:莫莉卡 interface Morrigan { public function display(); } //具體構件角色:原身 class original implements Morrigan { private $img="Morrigan0.jpg"; public function __construct() { echo "《惡魔戰士》中的莫莉卡·安斯蘭"; } public function setImage($img) { $this->img=$img; } public function display() { $src="src/decorator/".$this->img; echo $src; } } //抽象裝飾角色:變形 class Changer implements Morrigan { public $m; public function __construct(Morrigan $m) { $this->m=$m; } public function display() { $this->m->display(); } } //具體裝飾角色:女妖 class Succubus extends Changer { public function __construct(Morrigan $m) { parent::__construct($m); echo "《惡魔戰士》中的莫莉卡·安斯蘭變身女妖"; } public function display() { $this->setChanger(); parent::display(); } //執行變身(替換形態圖片) public function setChanger() { $this->m->setImage("Morrigan1.jpg"); } } //具體裝飾角色:少女 class Girl extends Changer { public function __construct(Morrigan $m) { parent::__construct($m); echo "《惡魔戰士》中的莫莉卡·安斯蘭之變身少女"; } public function display() { $this->setChanger(); parent::display(); } //執行變身(替換形態圖片) public function setChanger() { $this->m->setImage("Morrigan2.jpg"); } } class MorriganAensland { public static function main() { $m0=new original(); $m0->display(); $m1=new Succubus($m0); $m1->display(); $m2=new Girl($m0); $m2->display(); } } MorriganAensland::main(); ``` ## 裝飾模式的擴展 裝飾模式所包含的 4 個角色不是任何時候都要存在的,在有些應用環境下模式是可以簡化的,如以下兩種情況。 (1) 如果只有一個具體構件而沒有抽象構件時,可以讓抽象裝飾繼承具體構件,其結構圖如圖 4 所示。 ![](https://img.kancloud.cn/7d/57/7d57d24c22281e9a0b6e69284aff33e4_423x549.png) ``` //具體構件 class ConcreteComponet{ function operation(){ echo "原來的東西|"; } } //抽象裝飾 class Decorator extends ConcreteComponet{ private $componet; public function __construct(ConcreteComponet $componet){ $this->componet=$componet; } public function operation(){ $this->componet->operation(); } } //具體裝飾1 class ConcreteDecorator1 extends Decorator{ public function operation(){ parent::operation(); $this->addedFunction(); } public function addedFunction(){ echo "新增加的東西1|"; } } //具體裝飾2 class ConcreteDecorator2 extends Decorator{ public function operation(){ parent::operation(); $this->addedFunction(); } public function addedFunction(){ echo "新增加的東西2|"; } } // clients $concreteComponet = new ConcreteComponet(); $decorator1 = new ConcreteDecorator1($concreteComponet); $decorator2 = new ConcreteDecorator2($decorator1); $decorator1->operation();//輸出:原來的東西|新增加的東西1| echo '<br>--------<br>'; $decorator2->operation();//輸出:原來的東西|新增加的東西1|新增加的東西2| ``` (2) 如果只有一個具體裝飾時,可以將抽象裝飾和具體裝飾合并,其結構圖如圖 5 所示。 ![](https://img.kancloud.cn/33/8f/338f8348238ffc5370011f9b46791c8f_521x340.png) ``` interface Componet{ public function operation(); } //具體構件 class ConcreteComponet implements Componet{ function operation(){ echo "原來的東西|"; } } //具體裝飾與抽象裝飾合并 class ConcreteDecorator extends ConcreteComponet{ private $componet; public function __construct(ConcreteComponet $componet){ $this->componet=$componet; } public function operation(){ $this->componet->operation(); $this->addedFunction(); } public function addedFunction(){ echo "新增加的東西|"; } } // clients $concreteComponet = new ConcreteComponet(); $decorator = new ConcreteDecorator($concreteComponet); $decorator->operation();//輸出:原來的東西|新增加的東西| ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看