定义
动态的将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。
注:设计原则,类应该对扩展开放,对修改关闭。这样做的目的是由于,这样类易于扩展,在不修改原有代码的情况下,可以搭配新的行为,这样的设计具有弹性可以应对改变,便于扩展
- 装饰者模型类图
代码实现
- 被装饰类
/**
* 装饰者模式
*
* 饮料抽象类,所有的beverage都要继承超类
* @author utopia
* @date 20200823
*/
public abstract class Beverage {
public String description = "Unknown Beverage ";
public String getDescription(){
return description;
}
/**
* 价格
* @param
* @return
*/
public abstract double cost();
}
public class Espresso extends Beverage {
public Espresso(){
description = "Espresso";
}
@Override
public double cost() {
return 1.0;
}
}
public class HouseBlend extends Beverage {
public HouseBlend(){
description = "HouseBlend";
}
@Override
public double cost() {
return 2.0;
}
}
- 装饰类
public abstract class CondimentDecorator extends Beverage{
/**
* 重写Beverage getDescription()方法
* @param
* @return
*/
@Override
public abstract String getDescription();
}
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+"Mocha";
}
@Override
public double cost() {
return 1.1;
}
}
public class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage){
this.beverage=beverage;
}
@Override
public String getDescription() {
return beverage.getDescription()+"Soy";
}
@Override
public double cost() {
return beverage.cost()+1.3;
}
}
- 测试类
/**
* 装饰者模式
*
* 饮料抽象类,所有的beverage都要继承超类
* @author utopia
* @date 20200823
*/
public class OrderBeverage {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription()+"--"+beverage.cost());
Beverage mocha=new Mocha(beverage);
Beverage MochaSoy=new Soy(beverage);
System.out.println(mocha.getDescription()+"--"+mocha.cost());
System.out.println(MochaSoy.getDescription()+"--"+MochaSoy.cost());
}
}
output
Espresso--1.0
EspressoMocha--1.1
EspressoSoy--2.3
代码仓库:https://github.com/wenutopia/HeadFirst.git