android設計模式——裝飾者模式
阿新 • • 發佈:2018-11-06
定義:允許向一個現有的物件新增新的功能,同時又不改變其結構。
使用場景:能夠動態地擴充套件類的功能
應用舉例:一個畫可以被裝在畫框裡,並且被蒙上玻璃,這時候畫,玻璃,畫框組成了一個東西。
類圖:
- Comppoent: 抽象元件
- ConcreteComponet:元件的具體實現類
- Decorator:抽象裝飾者,
- ConcreteDecoratorA:裝飾者具體實現類
- ConcreteDecoratorB:裝飾者具體實現類
- Client:客戶類
關鍵程式碼:
- Component 類充當抽象角色,不應該具體實現。
- 修飾類引用和繼承 Component 類,具體擴充套件類重寫父類方法。
- 與建造者方法不同,抽象裝飾類聲明瞭裝飾著,但沒有初始化。
優點:
- 裝飾類與被裝飾者可以相互發展,不相互耦合。
- 是繼承的一個替代模式,可以動態擴充套件一個實現類的功能。
缺點:需要很多裝飾的話,會比較複雜。
abstract class Person{ public abstract void dressed(); } //ConcreteComponet:元件的具體實現類 class Boy extends Person{ @Override public void dressed() { // TODO 自動生成的方法存根 //實現最基本的邏輯 System.out.println("王小明穿了內衣內褲"); } } //Decorator:抽象裝飾者, abstract class PersonCloth extends Person{ protected Person mPerson; public PersonCloth(Person person) { mPerson = person; } public void dressed() { mPerson.dressed(); } } class ExpensiveCloth extends PersonCloth{ public ExpensiveCloth(Person person) { super(person); // TODO 自動生成的建構函式存根 } private void dressShirt() { System.out.println("還穿上了昂貴的短袖"); } private void dressJean() { System.out.println("還穿上了昂貴的牛仔褲"); } public void dressed(){ super.dressed(); dressShirt(); dressJean(); } } class CheapCloth extends PersonCloth{ public CheapCloth(Person person) { super(person); // TODO 自動生成的建構函式存根 } private void dressShirt() { System.out.println("還穿上了便宜的短袖"); } private void dressJean() { System.out.println("還穿上了便宜的牛仔褲"); } public void dressed(){ super.dressed(); dressShirt(); dressJean(); } }
主函式
public static void main(String[] args) {
Person person = new Boy();
//穿上便宜的衣服
PersonCloth cheapCloth = new CheapCloth(person);
cheapCloth.dressed();//展示出來
System.out.println();
PersonCloth expensiveCloth = new ExpensiveCloth(person);
expensiveCloth.dressed();
}
執行截圖