在實踐生產中,新需求老是不斷的出現。咱們能夠直接修改已有的組件代碼而且添加相應的功能,這顯然破壞了已有組件的穩定性,修改完成後,整個組件須要從新測試。違背了開閉原則。設計模式
咱們可使用繼承方式,經過建立子類添加新功能實擴展。這種方法是靜態的,用戶不能控制增長行爲的方式和時機。並且有些狀況下繼承是不可行的,例若有些組件被final修飾。另外,若是待添加的新功能存在多種組合方式 ,會致使大量的子類出現。例若有4個待添加的新功能,系統須要動態使用任意多個功能的組合,則須要添加15個子類才能知足需求。ide
裝飾器模式可以幫助咱們解決上述問題。類圖以下測試
假如如今有一塊蛋糕,其它什麼都不加,就是奶油蛋糕。若是加上草莓就是草莓蛋糕,若是加上巧克力,而後插上蠟燭,就變成了一塊生日蛋糕了。不管是奶油蛋糕,草莓蛋糕,仍是生日蛋糕,它們的核心都是蛋糕。像這樣不斷的爲對象添加裝飾的設計模式被稱爲Decorator模式。UML 類圖以下ui
代碼以下this
package decorator; /** * Created by dingshuangkun on 2018/1/27. * 蛋糕接口 */ public interface Cake { /** * 塗抹奶油 */ void makeCream(); /** * 包裝 */ void pack(); /** * 生產蛋糕 */ void make(); }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27.蛋糕 * 奶油蛋糕 */ public class CreamCake implements Cake{ @Override public void makeCream() { System.out.println("-------塗抹奶油-----"); } @Override public void pack() { System.out.println("------包裝----------"); } @Override public void make() { makeCream(); pack(); } }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27. */ public class Decorator implements Cake { private Cake cake; public Decorator(Cake cake) { this.cake = cake; } @Override public void makeCream() { cake.makeCream(); } @Override public void pack() { cake.pack(); } @Override public void make() { cake.make(); } }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27. */ public class ChocolateCake extends Decorator { public ChocolateCake(Cake cake) { super(cake); } private void addChocolate(){ System.out.println("-----添加巧克力-----"); } @Override public void make() { addChocolate(); } }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27. * * 水果蛋糕 */ public class FruitCake extends Decorator { public FruitCake(Cake cake) { super(cake); } private void addFruit(){ System.out.println("---添加水果---"); } @Override public void make() { super.makeCream(); addFruit(); } }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27. * 生日蛋糕 */ public class BirthdayCake extends Decorator { public BirthdayCake(Cake cake) { super(cake); } private void addCandle(){ System.out.println("-----添加蠟燭-------"); } @Override public void make() { addCandle(); super.pack(); } }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27. */ public class Client { public static void main(String[] args) { Cake cake = new CreamCake(); cake = new Decorator(new FruitCake(cake)); cake.make(); cake = new Decorator(new ChocolateCake(cake)); cake.make(); cake = new Decorator(new BirthdayCake(cake)); cake.make(); } }
運行結果設計
-------塗抹奶油-----
---添加水果---
-----添加巧克力-----
-----添加蠟燭-------
------包裝----------code
Process finished with exit code 0
對象