淺談設計模式之------裝飾者模式
首先給出裝飾者模式的定義吧:
動態的將責任附加到對象上,如果要擴展功能,裝飾者提供了比繼承更加具備彈性的替代方案。
其中,裝飾者模式秉承着一個原則:對外擴展開放,對修改關閉。、
下面以一個例子爲實例來增強對此模式的理解 如下是星巴克咖啡生產咖啡爲例,定義一個Beverage abstract class 用於表示飲料的總稱,裏面包括兩個方法getDescription()、cost()。定義一個裝飾組件CondimentDecorate CoComponent,其主要是用來調料裝飾的。其繼承Beverage抽象類。定義四中咖啡類型:DarkRoast、Decaf、Espresso、HouseBlend。四個裝飾調料對象:Milk、Mocha、Soy、Whip。其中調料組件和具體的調料組件具備相同的超類屬性。咱們能夠在類動態的運行的時候再根據客戶的需求加入相應的調料,從而能夠生產各類各樣的咖啡飲料。 如下是具體代碼實現: package com.clark.decoratepattern.abstractclass; /** * 定義一個飲料抽象類 * @author Administrator * */ public abstract class Beverage { public String description="Unknown Beverage"; public String getDescription(){ return description; } public abstract double cost(); } package com.clark.decoratepattern.abstractclass; /** * 調料抽象類,用於裝飾飲料 * 其應該和被裝飾的類具備相同的超類 * @author Administrator * 全部的裝飾者類也即調料者都必須從新實現getDescription()方法 */ public abstract class CondimentDecorate extends Beverage { public abstract String getDescription(); } package com.clark.decoratepattern; import com.clark.decoratepattern.abstractclass.Beverage; /** * 綜合咖啡類 * @author Administrator * */ public class HouseBlend extends Beverage { public double cost() { return 0.89; } public HouseBlend(){ description="House Blend Coffee"; } } package com.clark.decoratepattern; import com.clark.decoratepattern.abstractclass.Beverage; /** * 濃縮咖啡類 * @author Administrator * */ public class Espresso extends Beverage { //屬性繼承自父類 public Espresso(){ description="Espresso"; } public double cost() { return 1.99; } } package com.clark.decoratepattern; import com.clark.decoratepattern.abstractclass.Beverage; /** * 低咖啡因 * @author Administrator * */ public class Decaf extends Beverage { public double cost() { return 1.05; } public Decaf(){ description="decaf"; } } package com.clark.decoratepattern; import com.clark.decoratepattern.abstractclass.Beverage; /** * 深度烘焙咖啡 * @author Administrator * */ public class DarkRoast extends Beverage{ @Override public double cost() { return 0.99; } public DarkRoast(){ description="dark roast coffee"; } } package com.clark.decoratepattern.decorate; import com.clark.decoratepattern.abstractclass.Beverage; import com.clark.decoratepattern.abstractclass.CondimentDecorate; /** * 奶泡Whip調料裝飾對象 * @author Administrator * */ public class Milk extends CondimentDecorate { Beverage beverage; public Milk(Beverage beverage){ this.beverage=beverage; } @Override public String getDescription() { return this.beverage.getDescription()+",Milk"; } @Override public double cost() { return this.beverage.cost()+0.10; } } package com.clark.decoratepattern.decorate; import com.clark.decoratepattern.abstractclass.Beverage; import com.clark.decoratepattern.abstractclass.CondimentDecorate; /** * 摩卡裝飾調料類 * @author Administrator * */ public class Mocha extends CondimentDecorate { Beverage beverage; public Mocha(Beverage beverage){ this.beverage=beverage; } //返回裝飾調料的同時把其它的調料也描述 public String getDescription() { return this.beverage.getDescription()+",Mocha"; } //返回增長Mocha後的調料總價格 public double cost() { return 0.20+this.beverage.cost(); } } package com.clark.decoratepattern.decorate; import com.clark.decoratepattern.abstractclass.Beverage; import com.clark.decoratepattern.abstractclass.CondimentDecorate; /** * 豆漿Soy調料的裝飾 * @author Administrator * */ public class Soy extends CondimentDecorate { Beverage beverage; public Soy(Beverage beverage) { this.beverage=beverage; } @Override public String getDescription() { return this.beverage.getDescription()+",Soy"; } @Override public double cost() { return this.beverage.cost()+0.15; } } package com.clark.decoratepattern.decorate; import com.clark.decoratepattern.abstractclass.Beverage; import com.clark.decoratepattern.abstractclass.CondimentDecorate; /** * 奶泡Whip調料裝飾對象 * @author Administrator * */ public class Whip extends CondimentDecorate { Beverage beverage; public Whip(Beverage beverage){ this.beverage=beverage; } @Override public String getDescription() { return this.beverage.getDescription()+",Whip"; } @Override public double cost() { return this.beverage.cost()+0.10; } } 如下是測試類:便可以根據客戶的需求來生產咖啡 package com.clark.decoratepattern; import com.clark.decoratepattern.abstractclass.Beverage; import com.clark.decoratepattern.decorate.Milk; import com.clark.decoratepattern.decorate.Mocha; import com.clark.decoratepattern.decorate.Soy; import com.clark.decoratepattern.decorate.Whip; /** * Test class * @author Administrator * */ public class Test { public static void main(String[] args) { //來一杯濃縮咖啡,之家牛奶Milk Beverage bev=new Espresso(); bev=new Milk(bev); System.out.println(bev.getDescription()+" $"+bev.cost()); //來一杯深陪咖啡,加牛奶和摩卡 Beverage bev2=new DarkRoast(); bev2=new Milk(bev2); bev2=new Mocha(bev2); System.out.println(bev2.getDescription()+" $"+bev2.cost()); //來一杯低咖啡因,內加牛奶、摩卡、奶泡 Beverage bev3=new HouseBlend(); bev3=new Milk(bev3); bev3=new Mocha(bev3); bev3=new Whip(bev3); System.out.println(bev3.getDescription()+" $"+bev3.cost()); //來一杯綜合的咖啡,內部加奶牛、摩卡、奶泡、豆漿 Beverage bev4=new Decaf(); bev4=new Milk(bev4); bev4=new Mocha(bev4); bev4=new Whip(bev4); bev4=new Soy(bev4); System.out.println(bev4.getDescription()+" $"+bev4.cost()); } }