裝飾者模式html
動態地給一個對象添加一些額外的職責,就增長功能來講,裝飾模式比生成子類更加靈活.java
場景:設計模式
經過給小明穿衣服來演示裝飾者模式ide
被裝飾的人類
/** * 被裝飾的人 */ public class Person { /** * 名字 */ private String name; /** * 構造函數 * * @param name */ public Person(String name) { this.name = name; } public Person() { } public void show() { System.out.println(MessageFormat.format("裝扮的{0}", this.name)); } }
服飾類
/** * 服飾類 */ public class Finery extends Person { /** * 成員 */ protected Person component; /** * 打扮 * * @param component */ public void decorate(Person component) { this.component = component; } @Override public void show() { if (this.component != null) { this.component.show(); } } }
服飾子類函數
/** * T恤類 */ public class TShirts extends Finery { @Override public void show() { System.out.println("大致恤 "); super.show(); } } /** * 垮褲類 */ public class BigTrouset extends Finery { @Override public void show() { System.out.println("垮褲 "); super.show(); } } /** * 破鞋子類 */ public class BrokenShoes extends Finery { @Override public void show() { System.out.println("破鞋子 "); super.show(); } }
調用:post
/** * 大話設計模式(java版) * 第三章:裝飾者設計模式 */ public class DecoratorDemo { public static void main(String[] args) { Person person=new Person("小明"); System.out.println("裝扮風格: "); //T恤 TShirts tShirts=new TShirts(); //垮褲 BigTrouset bigTrouset =new BigTrouset(); //破鞋子 BrokenShoes brokenShoes=new BrokenShoes(); //裝飾小明 tShirts.decorate(person); //裝飾T恤 bigTrouset.decorate(tShirts); //裝飾垮褲 brokenShoes.decorate(bigTrouset); brokenShoes.show(); } }
結果this
裝扮風格:
破鞋子
垮褲
大致恤
裝扮的小明
解析:url
1.須要把所需的功能按正確的順序串聯起來進行控制.spa
2.裝飾模式是爲已有功能動態的添加更多功能的一種方式.設計
3.當系統須要新的功能的時候,是向舊的類中添加新的代碼.這樣新加的代碼一般裝飾了原有類的核心職責或主要行爲.
4.再主類中加入了新的字段,新的方法和新的邏輯,從而增長了主類的複雜度,二這些新加入的東西僅僅是爲了知足一些只在某種特定狀況下才會執行的特殊行爲須要,裝飾模式卻提供了一個很是好的解決方案,他吧每一個要裝飾的功能放在單獨的類中,並讓這個類包裝他所要裝飾的對象,所以,當須要執行特殊行爲時,客戶端代碼就能夠在運行時根據須要有選擇、按順序地使用裝飾功能包裝對象.
5.裝飾模式的優勢,把類中的裝飾功能從類中搬移去除,這樣能夠簡化原有的類,有效的把類的核心職責和裝飾功能區分開了,並且能夠去除相關類中重複的裝飾邏輯.