装饰者模式
场景
- 星巴克咖啡店
饮品
- 蒸馏咖啡
- 混合搅拌咖啡
如上的饮品都可以加 牛奶
、抹茶
等等:
装饰者模式定义
在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式
角色
抽象构件(Component)角色
定义一个抽象接口以规范准备接收附加责任的对象
具体构件(Concrete Component)角色
实现抽象构件,通过装饰角色为其添加一些职责
抽象装饰(Decorator)角色
继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能
具体装饰(ConcreteDecorator)角色
实现抽象装饰的相关方法,并给具体构件对象添加附加的责任
代码实现
定义饮品与品类
Beverage.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:34
* @description
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public abstract class Beverage {
private float price;
private String desc;
/**
* 成本
*
* @return float
*/
public abstract float cost();
}
HouseBlend.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:36
* @description
**/
public class HouseBlend extends Beverage {
public HouseBlend() {
super(30, "混合咖啡~");
}
@Override
public float cost() {
return getPrice();
}
}
Espresso.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:38
* @description
**/
public class Espresso extends Beverage {
public Espresso() {
super(20, "意大利咖啡~");
}
@Override
public float cost() {
return getPrice();
}
}
定义调味器装饰
Mocha.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:53
* @description
**/
public class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
super(beverage, 5, "抹茶");
}
@Override
public float cost() {
return getPrice() + getBeverage().cost();
}
@Override
public String getDesc() {
return super.getDesc() + getBeverage().getDesc();
}
}
Milk.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:42
* @description
**/
public class Milk extends CondimentDecorator {
public Milk(Beverage beverage) {
super(beverage, 5, "牛奶");
}
@Override
public float cost() {
return getPrice() + getBeverage().cost();
}
@Override
public String getDesc() {
return super.getDesc() + getBeverage().getDesc();
}
}
CondimentDecorator.java
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:39
* @description
**/
@EqualsAndHashCode(callSuper = true)
@Data
public abstract class CondimentDecorator extends Beverage {
private Beverage beverage;
public CondimentDecorator(Beverage beverage, float price, String desc) {
super(price, desc);
this.beverage = beverage;
}
}
使用如上所创建的类:
/**
* @author BNTang
* @program design-pattern-pro
* @date Created in 2021/10/12 012 11:54
* @description
**/
public class Client {
public static void main(String[] args) {
Beverage espresso = new Espresso();
System.out.println(espresso.getDesc() + " " + espresso.cost() + "元");
espresso = new Milk(espresso);
System.out.println(espresso.getDesc() + " " + espresso.cost() + "元");
espresso = new Mocha(espresso);
System.out.println(espresso.getDesc() + " " + espresso.cost() + "元");
}
}
UML 图
源码中应用
敬请期待