装饰者模式
定义:动态的将责任附加到对象身上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
- 装饰者和被装饰者有相同的超类型
- 可以用一个或者多个装饰者包装一个对象
- 在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它
- 装饰者可以在所委托被装饰者的行为之前/之后,加上自己的行为,以达到特定的目的
- 对象可以在任何时候被装饰,所以可以运行时动态的、不限量地用你喜欢地装饰者来装饰对象
涉及设计原则
开闭原则:类应该对扩展开放,对修改关闭
例子
购买饮料时可以添加不同的配料
原始代码:Beverge类是店铺原始的设计抽象类
public abstract class Beverage {
public String getDesectrption() {
return desectrption;
}
String desectrption = "Beverage";
public abstract double cost();
}
Condiment装饰者类
public abstract class CondimentDecorator extends Beverage{
@Override
public abstract String getDesectrption();
}
下面实现一些饮料类,也就是组件。需要为具体的饮料设置描述,还要实现cost方法
public class Epresso extends Beverage {
public Epresso() {
desectrption="Epresso";
}
@Override
public double cost() {
return 1.99;
}
}
public class HouseBlend extends Beverage {
public HouseBlend() {
desectrption="House and Blend";
}
@Override
public double cost() {
return .89;
}
}
实现具体的装饰者,mocha。
public class Mocha extends CondimentDecorator {
Beverage beverage;//记录饮料,也就是被装饰者
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDesectrption() {
return beverage.getDesectrption()+",Mocha";
}
@Override
public double cost() {
return beverage.cost()+.20;
}
}
测试类
public static void main(String[] args) {
Beverage beverage=new Epresso();
System.out.println(beverage.getDesectrption()+"$"+beverage.cost());
Beverage beverage1=new HouseBlend();
beverage1=new Mocha(beverage1);
beverage1=new Mocha(beverage1);
System.out.println(beverage1.getDesectrption()+"$"+beverage1.cost());
}
运行结果:
Epresso$1.99
House and Blend,Mocha,Mocha$1.29