装饰者模式动态地将责任附加到对象上。如要扩展功能,装饰者提供了比继承更有弹性的替代方案。java
设计原则:类应该对扩展开放,对修改关闭。设计模式
抽象组件Component :测试
Beverage类(能够是接口也能够是抽象类)this
package com.sun; public abstract class Beverage { String description = "Unknow Beverage"; public String getDescription(){ return description; } public abstract double cost(); }
具体组件ConcreteComponent:具体组件扩展自 Beverage类设计
DarkRost类code
package com.sun; public class DarkRost extends Beverage { public DarkRost(){ description = "this is DarkRost"; } public double cost() { return 0.88; } }
Espresso类对象
package com.sun; public class Espresso extends Beverage{ public Espresso(){ description = "Espresso"; } public double cost(){ return 1.99; } }
HouseBlend类继承
package com.sun; public class HouseBlend extends Beverage { public HouseBlend(){ description = "House Blend Coffee"; } public double cost() { return .89; } }
抽象装饰者Decorator: 必须让 抽象装饰者可以取代Beverage,因此将抽象装饰者扩展自Beverage类接口
CondimentDecorator类ip
package com.sun; public abstract class CondimentDecorator extends Beverage{ public abstract String getDescription(); }
具体装饰者:
Mocha类
package com.sun; public class Mocha extends CondimentDecorator { Beverage beverage; public Mocha(Beverage beverage){ this.beverage = beverage; } public String getDescription() { /*由于Beverage对象已经被装饰过,因此这里不仅是想描述被装饰者(例如DarkRost),而是连同装饰者都描述出来(例如“DarkRoast,Mocha”。因此首先利用委托的作法,获得一个叙述,而后在其后加上附加的叙述。*/ return beverage.getDescription() +",Mocha"; } public double cost() { return .20 + beverage.cost(); } }
Whip类
package com.sun; public class Whip extends Beverage { Beverage beverage; public Whip(Beverage beverage){ this.beverage = beverage; } public String getDescription(){ return beverage.getDescription() + ", Whip"; } public double cost() { return 0.22 + beverage.cost(); } }
测试类:StarbuzzCoffee
package com.sun; public class StarbuzzCoffee { public static void main(String[] args) { Beverage beverage = new Espresso(); System.out.println(beverage.getDescription()+"$" + beverage.cost()); Beverage beverage2 = new DarkRost(); beverage2 = new Mocha(beverage2); //用Mocha装饰DarkRost对象 beverage2 = new Whip(beverage2); //用第二个Mocha装饰DarkRost对象 System.out.println(beverage2.getDescription()+"$" + beverage2.cost()); Beverage beverage3 = new HouseBlend(); beverage3 = new Whip(beverage3); //用Whip装饰HouseBlend对象 beverage3 = new Mocha(beverage3); //用Mocha装饰HouseBlend对象 System.out.println(beverage3.getDescription() + "$" +beverage3.cost()); } }
测试结果:
Espresso$1.99 this is DarkRost,Mocha, Whip$1.3 House Blend Coffee, Whip,Mocha$1.31
能够利用工厂和生成器设计模式,能以更好的方式创建被装饰者对象。