动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
涉及角色:
抽象组件:定义一个抽象接口,来规范准备附加功能的类。
具体组件:将要被附加功能的类,实现抽象构件角色接口。
抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色接口。
具体装饰:实现抽象装饰者角色,负责为具体构件添加额外功能。
示例代码的实现(具体介绍):
Drink.java 被装饰者对象的接口
SoyaBeanMilk.java 具体的被装饰者对象
Decorator.java 装饰者基类
EggDecorator.java 具体装饰者对象
SugarDecorator.java 具体装饰者对象
BlackBeanDecorator.java 具体装饰者对象
//被装饰者的接口 public interface Drink { //计算价格 float cost(); //描述 String description(); }
//具体的被装饰者对象,豆浆 public class SoyaBeanMilk implements Drink{ @Override public float cost() { return 10f; } @Override public String description() { return "纯豆浆"; } }
//装饰者基类 public abstract class Decorator implements Drink { private Drink drink;//要装饰的对象 public Decorator(Drink drink) { this.drink = drink; } @Override public float cost() { return drink.cost(); } @Override public String description() { return drink.description(); } }
//具体装饰者对象 public class EggDecorator extends Decorator{ public EggDecorator(Drink drink) { super(drink); } @Override public float cost() { return super.cost() +3.0f; } @Override public String description() { return super.description() + "+鸡蛋"; } }
//具体装饰者对象 public class SugarDecorator extends Decorator{ public SugarDecorator(Drink drink) { super(drink); } @Override public float cost() { return super.cost() +1.0f; } @Override public String description() { return super.description() + "+糖"; } }
//具体装饰者对象 public class SugarDecorator extends Decorator{ public SugarDecorator(Drink drink) { super(drink); } @Override public float cost() { return super.cost() +1.0f; } @Override public String description() { return super.description() + "+糖"; } }
具体使用:
Drink drink = new SoyaBeanMilk(); SugarDecorator sugarDecorator = new SugarDecorator(drink); EggDecorator eggDecorator = new EggDecorator(sugarDecorator); BlackBeanDecorator blackBeanDecorator = new BlackBeanDecorator(eggDecorator); System.out.println("你点的是:" + blackBeanDecorator.description()); System.out.println("价格是:" + blackBeanDecorator.cost() + "元");
最后得出的结果是:
你点的是:纯豆浆+糖+鸡蛋+黑豆
价格是:16.0元