基本定義裝飾者模式屬于結(jié)構(gòu)型模式,它可以動態(tài)的將新功能附加到對象上,同時又不改變其結(jié)構(gòu)。在對象功能擴展方面,它比繼承更有彈性,裝飾者模式也體現(xiàn)了開閉原則(OCP)。 模式結(jié)構(gòu)
舉例說明
「實體類」 Coffee public abstract class Coffee{ public String des = "咖啡"; //描述 private float price = 0.0f; //價格 protected abstract float cost(); //計算費用 //省略getter setter方法 } 「被裝飾者」LatteCoffee public class LatteCoffee extends Coffee{ public LatteCoffee() { setDes("拿鐵咖啡"); setPrice(4.5f); } @Override protected float cost() { return getPrice(); } } 「被裝飾者」MochaCoffee public class MochaCoffee extends Coffee { public MochaCoffee() { setDes("摩卡咖啡"); setPrice(5.5f); } @Override protected float cost() { return getPrice(); } } 「抽象裝飾者」Decorator public class Decorator extends Coffee { private Coffee coffee; public Decorator(Coffee drink) { this.coffee = drink; } @Override protected float cost() { return getPrice() + coffee.cost(); } @Override public String getDes() { return coffee.getDes() + "加" + super.getDes(); } } 「具體裝飾者」SugarDecorator public class SugarDecorator extends Decorator{ public SugarDecorator(Coffee coffee) { super(coffee); setDes("糖"); setPrice(1.0f); } } 「具體裝飾者」MilkDecorator public class MilkDecorator extends Decorator{ public MilkDecorator(Coffee coffee) { super(coffee); setDes("牛奶"); setPrice(2.0f); } } 「測試類」Client public class Client { /** * 點一杯 加兩份糖一份牛奶的摩卡咖啡 */ @Test public void test01() { Coffee order = new MochaCoffee(); System.out.println(order.getDes() + ",價格:" + order.cost()); //加兩份糖 order = new SugarDecorator(new SugarDecorator(order)); System.out.println(order.getDes() + ",價格:" + order.cost()); //加一份牛奶 order = new MilkDecorator(order); System.out.println(order.getDes() + ",價格:" + order.cost()); } } 「結(jié)果」result 摩卡咖啡,價格:5.5 摩卡咖啡加糖加糖,價格:7.5 摩卡咖啡加糖加糖加牛奶,價格:9.5 在 Java IO 流中的應用在上圖所示的關(guān)系中
具體使用如下: BufferedInputStream bis = new BufferedInputStream(new FileInputStream("G:\\a.txt")); 裝飾者模式總結(jié)1、利用繼承設計子類,只能在編譯時靜態(tài)決定,并且所有子類都會繼承相同的行為;利用組合擴展對象,就可以在運行時動態(tài)的進行擴展。 2、裝飾者和被裝飾者對象有相同的超類型,所以在任何需要原始對象(被裝飾者)的場合,都可以用裝飾過的對象代替原始對象。 3、可以用一個或多個裝飾者包裝一個對象(被裝飾者)。 4、裝飾者可以在所委托的裝飾者行為之前或之后加上自己的行為,以達到特定的目的。 5、被裝飾者可以在任何時候被裝飾,所以可以在運行時動態(tài)地、不限量地用你喜歡的裝飾者來裝飾對象。 6、裝飾者會導致出現(xiàn)很多小對象,如果過度使用,會讓程序變得復雜。 |
|