參考鏈結1:
參考鏈結2:
裝飾器模式:在不改變原類和不生成子類的情況下,動態為物件新增額外的職責。其比繼承更靈活、更具彈性。
不改變原類擴充套件功能,符合開閉原則(對修改關閉,對新增開放);
不通過子類擴充套件功能,可以讓類設計更靈活。因為繼承實現子類行為,編譯是靜態的;而用組合擴充套件功能,則可以在程式執行時動態擴充套件。
在客戶端中對concretecomponent進行裝飾的語句就為:
abstractdecorator decorator = newconcretedecorator2(new concretecomponent());
decorator例項介面與被裝飾者介面(operator())保持一致,但客戶端通過裝飾器示例呼叫operator()方法時,功能已可以被動態增加。
1) 抽象角色(icomponent):給出乙個抽象介面,以規範準備接受附加職能的物件。
2) 具體角色(concretecomponent):被裝飾者,其實現介面與抽象角色保持一致。
3) 抽象裝飾角色(abstractdecorator):裝飾器,實現並聚合了抽象角色。實現抽象角色是為了裝飾者與被裝飾者保持相同的對外介面;聚合了乙個抽象角色,是為了通過此角色,在執行時動態呼叫某一具體角色。
4) 具體裝飾角色(concretedecorator):需要擴充套件功能的動態實現,具體的裝飾器。
2) io操作之一:bufferedinputstream對fileinputstream裝飾:
bufferedinputstream buf = new bufferedinputstream(newfileinputstream(「filepath」));
類圖如下:filterinputstream相當於抽象裝飾器角色,fileinputstream是被裝飾的角色,inputstream抽象類是裝飾器與被裝飾器共同的規範,bufferedinputstream則是具體的裝飾實現。換句話說,這裡的bufferedinputstream是對fileinputstream裝飾了緩衝區功能,若實際需求中你對fileinputstream現有功能不滿,你可以自定filterinputstream的子類,實現自己的裝飾器。
舉例實現三個裝飾器,每個擴充套件乙個功能,在客戶端呼叫裝飾器時,對其進行了三次裝飾,那麼裝飾器示例三個功能都具備。
1) 抽象角色:
public inte***ce isource
2) 具體角色:
public class sourceimpl implements isource
}
3) 抽象裝飾角色:
public abstract class abstractdecoratorsource implements isource
public void operatrion()
}
4) 具體裝飾角色,a、b、c:
public class decoratorsourcea extends abstractdecoratorsource
@override
public void operatrion()
}public class decoratorsourceb extends abstractdecoratorsource
@override
public void operatrion()
}public class decoratorsourcec extends abstractdecoratorsource
@override
public void operatrion()
}
5) 客戶端呼叫測試
public class test
}
6) 輸出結果:
設計模式學習筆記 裝飾器模式
比如人的行為類,剛剛開始的時候,就能上得了廳堂,下得了廚房。但隨著年歲的增長,每個人歷經了世事,變得不僅是上得了廳堂,下得了廚房。有些人能鬥得過流氓,有些人修得了電腦。那麼如果用 表示這些增加了特殊行為的人。inte ce iperson class person implements iperso...
裝飾器模式筆記
定義 裝飾者模式 動態的將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。功能 除了繼承,裝飾者模式可以更彈性的擴充套件功能。優點 良好的設計原則,類對擴充套件開放,對修改關閉。裝飾者類可動態的用於裝飾元件。可以用無數個裝飾類包裝乙個元件。缺點 會導致設計中出現很多小物件,...
裝飾模式學習筆記
裝飾模式的定義 動態地給乙個物件新增額外的職責,就新增功能來說,裝飾模式比生成子類更加靈活。這段話比較抽象,自己根據裝飾模式實踐了一下,有了一些小小的領悟分享一下。我們最開始有一抽象類,比如說是人,它有兩個子類分別是學生和老師,並且有一些共有的屬性放在抽象類 人 中,有一些獨有的屬性放在各自的學生類...