在不改變原有物件的基礎之上,動態地將額外的功能附加到該物件上,提供了比繼承更有彈性的替代方案。
適用於:
拓展乙個類的功能;
動態給物件新增功能,並且動態撤銷。
優點:繼承的有力補充,不改變原有物件的情況下給物件拓展功能;
通過使用不同的裝飾類、不同的組合方式,實現不同的效果。
符合開閉原則。
缺點:裝飾模式增加了許多子類,如果過度使用會使程式變得很複雜,增加程式複雜性;
裝飾模式主要包含以下角色。
抽象構件(component)角色:定義乙個抽象介面以規範準備接收附加責任的物件。
具體構件(concrete component)角色:實現抽象構件,通過裝飾角色為其新增一些職責。
抽象裝飾(decorator)角色:繼承抽象構件,幷包含具體構件的例項,可以通過其子類擴充套件具體構件的功能。
具體裝飾(concretedecorator)角色:實現抽象裝飾的相關方法,並給具體構件物件新增附加的責任。
比如去沙縣吃麵的時候,可以往面裡加雞蛋和肉末啥的,**也會相應的調整,要支援不同食物自由組合,並計算相應的**,則可以使用裝飾模式來完成。
1.假設去沙縣吃碗麵,定義乙個麵條的抽象類,裡面有備註和**兩個抽象方法
public
abstract
class
noodlesabstract
2.定義乙個麵條抽象類的裝飾器,繼承自麵條抽象類,重寫抽象類的抽象方法
public
abstract
class
noodlesabstractdecorator
extends
noodlesabstract
@override
public string remark()
@override
public
intprice()
}
3.建立初始的麵條類,繼承自麵條抽象類
public
class
noodles
extends
noodlesabstract
@override
public
intprice()
}
4.定義乙個雞蛋裝飾器繼承自麵條裝飾器,吃麵的時候可以加個蛋
public
class
eggdecorator
extends
noodlesabstractdecorator
@override
public string remark()
@override
public
intprice()
}
5.定義乙個肉末裝飾器繼承自麵條裝飾器,吃麵的時候可以加點肉末
public
class
meatdecorator
extends
noodlesabstractdecorator
@override
public string remark()
@override
public
intprice()
}
6.測試輸出,有兩種寫法
public
class
test
}//點了一碗面,加了乙個蛋,加了點肉末 **要17元
//點了一碗面,加了點肉末,加了乙個蛋 **要17元
設計模式 結構型模式 裝飾模式
設計模式 結構型模式 裝飾模式 以成績單需要家長簽字為要求。成績單類圖 抽象成績單 public abstract class schoolreport 下面書寫四年級成績單 public class fouthgradeschoolreport extends schoolreport 家長簽名 ...
設計模式 結構型模式 裝飾模式
在不改變現有物件結構的情況下,動態地給該物件增加一些職責 即增加其額外功能 的模式,它屬於物件結構性模式。優點 缺點主要缺點是 會增加很多子類,過度使用會增加程式的複雜性。結構主要角色 類圖 實現inte ce component class concretecomponent implements...
裝飾模式(結構型模式)
裝飾模式是一種動態的給類中新增新行為的設計模式,裝飾模式比生成子類更為靈活,可以給某個物件而不是整個類新增一些功能。值得注意的是裝飾模式的裝飾類也繼承介面類,同時他也有介面類的指標指向他需要裝飾的具體類。外表看著像is a的關係,實際也是has a的關係。實際應用中裝飾類可以同時裝飾幾個具體類。可以...