裝飾模式 Decorator Pattern

2021-09-11 13:10:06 字數 2006 閱讀 4744

裝飾模式能夠實現動態的為物件新增功能,是從乙個物件外部來給物件新增功能。通常有兩種方式可以實現給乙個類或物件增加行為:

顯然,為了擴充套件物件功能頻繁修改父類或者派生子類這種方式並不可取。在物件導向的設計中,我們應該盡量使用物件組合,而不是物件繼承來擴充套件和復用功能。裝飾器模式就是基於物件組合的方式,可以很靈活的給物件新增所需要的功能。裝飾器模式的本質就是動態組合。動態是手段,組合才是目的。總之,裝飾模式是通過把複雜的功能簡單化,分散化,然後在執行期間,根據需要來動態組合的這樣乙個模式。

component:元件物件的介面,可以給這些物件動態的新增職責;

concretecomponent:具體的元件物件,實現了元件介面。該物件通常就是被裝飾器裝飾的原始物件,可以給這個物件新增職責;

decorator:所有裝飾器的父類,需要定義乙個與component介面一致的介面(主要是為了實現裝飾器功能的復用,即具體的裝飾器a可以裝飾另外乙個具體的裝飾器b,因為裝飾器類也是乙個component),並持有乙個component物件,該物件其實就是被裝飾的物件。如果不繼承component介面類,則只能為某個元件新增單一的功能,即裝飾器物件不能再裝飾其他的裝飾器物件。

concretedecorator:具體的裝飾器類,實現具體要向被裝飾物件新增的功能。用來裝飾具體的元件物件或者另外乙個具體的裝飾器物件。

1.component抽象類, 可以給這些物件動態的新增職責

abstract class component

複製**

2.component的實現類

class concretecomponent extends component

}複製**

3.裝飾器的抽象類,維持乙個指向元件物件的介面物件, 並定義乙個與元件介面一致的介面

abstract class decorator extends component

abstract public function operation();

}複製**

4.裝飾器的具體實現類,向元件物件新增職責,beforeoperation(),afteroperation()為前後新增的職責。

class concretedecoratora extends decorator

//在呼叫父類的operation方法的後置操作

public function

afteroperation()

public function

operation()

}class concretedecoratorb extends decorator

//在呼叫父類的operation方法的後置操作

public function

afteroperation()

public function

operation()

}複製**

5.客戶端使用裝飾器

class client

}$client = new client();

$client->main();

複製**

6.執行結果

oncretedecoratorb|concretedecoratorb::beforeoperation

concretedecoratora|concretedecoratora::beforeoperation

concretecomponent|concretecomponent::operation

concretedecoratora|concretedecoratora::afteroperation

concretedecoratorb|concretedecoratorb::afteroperation

複製**

設計模式 裝飾模式

裝飾模式,動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。m 超級瑪麗 普通繼承模式實現 a 發鏢 能組合出七種功能 m1 a m4 a b b 變身 m2 b m5 a c c 無敵 m3 c m6 b c m7 a b m m1 a b 組合方法 new m2 m...

設計模式 裝飾模式

剛看了看設計模式,真是費了好多的腦細胞。想著想著就到了食堂。o o哈!正是長身體的時候 大神勿噴 一定要多吃點。於是我打了乙份公尺飯,然後又端著盛公尺飯的盤子買了乙份菜 看著還不是很夠,就又端著這個盤子買了一條最愛吃的魚。裝飾模式!五一要來了。回家轉轉,沒有小外甥的玩具怎麼行。於是我去超市,推著購物...

設計模式 裝飾模式

複習設計模式 裝飾模式 裝飾模式 在不修改已經存在的類的情況下,動態的新增新的功能,實現即插即用,開放關閉原則 public inte ce man public class batman implements man override public void killmonster public ...