java io中广泛应用到了装饰者模式
装饰者和被装饰对象有相同的超类型
你可以使用一个或多个装饰者包装一个对象
既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装)的场合,可以用装饰过的对象代替它。
(关键点)装饰者可以在委托被装饰者的行为之前与/或之后,加上自己的行为,已达到特定的目的
对象可以在任何时候被装饰,所以可以在运行时动态的、不限量的使用你喜欢的装饰者来装饰对象
1 基类--饮料(抽象类) 描述和价格
package com.pattern; /** * * @author shasha * 饮料类 */ public abstract class Beverage { String description ="unknown beverage"; public String getDescription(){ return description; } public abstract double cost(); }
2 装饰基类---调料 重写描述是为了在装饰的时候灵活加上描述
package com.pattern; /*** * * @author duwan * 调料(装饰者基类) */ public abstract class CondimentDecorator extends Beverage{ @Override //重写描述方法 public abstract String getDescription(); }
3 两个饮料类 和 它们的三个装饰者
package com.pattern; /*** * * @author shasha * 浓咖啡 */ public class Espresso extends Beverage { @Override public double cost() { // TODO Auto-generated method stub return 1.49; } public Espresso(){ description="Espressso"; } } package com.pattern; public class HouseBlend extends Beverage { @Override public double cost() { // TODO Auto-generated method stub return 1.99; } public HouseBlend(){ description="HouseBlend Coffee"; } } package com.pattern; /*** * * @author shasha * 牛奶--调料装饰者 */ public class Milk extends CondimentDecorator{ //被装饰者 Beverage beverage; public Milk(Beverage beverage){ this.beverage=beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.description+", Milk"; } @Override public double cost() { // TODO Auto-generated method stub return 0.25+beverage.cost(); } } package com.pattern; /** * * @author shasha * 摩卡是一个装饰者 */ public class Mocha extends CondimentDecorator{ Beverage beverage; public Mocha(Beverage beverage){ this.beverage=beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription()+",Mocha"; } @Override public double cost() { // TODO Auto-generated method stub return 0.20+beverage.cost(); } } package com.pattern; /*** * * @author shasha * 大豆是一种调料装饰者 */ public class Soy extends CondimentDecorator { Beverage beverage; public Soy(Beverage beverage){ this.beverage=beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription()+",Soy"; } @Override public double cost() { // TODO Auto-generated method stub return 0.30+beverage.cost(); } }
4 开始装饰模式的测试
package com.pattern; /** * * @author shasha * 咖啡厅 来测试 */ public class StarbuzzCoffee { public static void main(String[] args) { Beverage beverage=new Espresso(); System.out.println(beverage.getDescription()+" $"+beverage.cost()); Beverage beverage2=new HouseBlend(); beverage2=new Mocha(beverage2); beverage2=new Mocha(beverage2); beverage2=new Soy(beverage2); System.out.println(beverage2.getDescription()+" $"+beverage2.cost()); } }