装饰器模式(Decorator Pattern),是一种行为型模式。该模式的目的是给对象动态地添加新特性。现实中的场景如,给咖啡添加调味品(牛奶,糖之类),给房间添加各种装饰物等等。
一、UML类图
二、代码示例
参与者:Component
public abstract class Coffee {
private String desc;
private float price = 0.0f;
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
protected abstract float cost();
}
// 相当于UML图中的Component
public class PureCoffee extends Coffee {
protected float cost() {
return getPrice();
}
}
参与者:ConcreteComponent
public class Espresso extends PureCoffee {
public Espresso() {
setDesc("意式咖啡");
setPrice(16.0f);
}
}
public class Cappuccino extends PureCoffee {
public Cappuccino() {
setDesc("卡布奇诺");
setPrice(20.f);
}
}
参与者:Decorator
public class Flavorator extends Coffee {
private Coffee coffee;
// 体现装饰关系
public Flavorator(Coffee coffee) {
this.coffee = coffee;
}
protected float cost() {
// 调理价格 + 咖啡本身的价格
return super.getPrice() + coffee.getPrice();
}
@Override
public String getDesc() {
return super.getDesc() + " && " + coffee.getDesc();
}
}
参与者:ConcreteDecorator
public class Milk extends Flavorator {
public Milk(Coffee coffee) {
super(coffee);
setDesc(" 加点牛奶 ");
setPrice(3.5f);
}
}
public class Ice extends Flavorator {
public Ice(Coffee coffee) {
super(coffee);
setDesc(" 加点冰 ");
setPrice(2.0f);
}
}
客户类
public class Client {
public static void main(String[] args) {
// 点一份意式咖啡
Coffee esCoffee = new Espresso();
// 点一份卡布奇诺
Coffee capCoffee = new Cappuccino();
System.out.println("费用1 = " + esCoffee.cost());
System.out.println("描述1 = " + esCoffee.getDesc());
System.out.println("-----------------------------");
System.out.println("费用2 = " + capCoffee.cost());
System.out.println("描述2 = " + capCoffee.getDesc());
System.out.println("-----------------------------");
// 给意式咖啡加点奶;用Milk来包装一下,本质上还是Coffee
esCoffee = new Milk(esCoffee);
// 给卡布奇诺加点冰;用Ice来包装一下,本质上还是Coffee
capCoffee = new Ice(capCoffee);
System.out.println("费用11 = " + esCoffee.cost());
System.out.println("描述11 = " + esCoffee.getDesc());
System.out.println("-----------------------------");
System.out.println("费用22 = " + capCoffee.cost());
System.out.println("描述22 = " + capCoffee.getDesc());
}
}
运行结果
费用1 = 16.0
描述1 = 意式咖啡
-----------------------------
费用2 = 20.0
描述2 = 卡布奇诺
-----------------------------
费用11 = 19.5
描述11 = 加点牛奶 && 意式咖啡
-----------------------------
费用22 = 22.0
描述22 = 加点冰 && 卡布奇诺
三、参考
- https://www.runoob.com/design-pattern/decorator-pattern.html
- https://www.youtube.com/watch?v=3CMT4tbDVjE
设计模式系列博文导航
一、创建型 - 5种
原型模式(Prototype Pattern)
抽象工厂模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
工厂模式(Factory Pattern)
单例模式(Singleton Pattern)
助记语:原抽建工单
二、结构型 - 8种
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
适配器模式(Adapter Pattern)
外观模式(Facade Pattern)
过滤器模式(Filter/Criteria Pattern)
桥接模式(Bridge Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
助记语:想呆室外,过桥组装
三、行为型 - 11种
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
中介者模式(Mediator Pattern)
迭代器模式(Iterator Pattern)
观察者模式(Observer Pattern)
策略模式(Strategy Pattern)
状态模式(State Pattern)
备忘录模式(Memento Pattern)
模板方法模式(Template Pattern)
访问者模式(Visitor Pattern)
助记语:责令解中谍,观测状被模仿