Java 实现装饰器模式
下面是一个经典的咖啡加配料案例的装饰器模式实现:
接口 - 定义饮料的抽象
interface Beverage {
String getDescription();
double cost();
}
具体的基本饮料
class Espresso implements Beverage {
@Override
public String getDescription() {
return "Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
class HouseBlend implements Beverage {
@Override
public String getDescription() {
return "House Blend Coffee";
}
@Override
public double cost() {
return 0.89;
}
}
抽象类 - 所有装饰器的基类
abstract class CondimentDecorator implements Beverage {
protected Beverage beverage;
public CondimentDecorator(Beverage beverage) {
this.beverage = beverage;
}
@Override
public abstract String getDescription();
}
具体的装饰器类
class Milk extends CondimentDecorator {
public Milk(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Milk";
}
@Override
public double cost() {
return beverage.cost() + 0.20;
}
}
class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
@Override
public double cost() {
return beverage.cost() + 0.30;
}
}
class Soy extends CondimentDecorator {
public Soy(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Soy";
}
@Override
public double cost() {
return beverage.cost() + 0.15;
}
}
class Whip extends CondimentDecorator {
public Whip(Beverage beverage) {
super(beverage);
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Whip";
}
@Override
public double cost() {
return beverage.cost() + 0.10;
}
}
Client 类 - 使用装饰器模式
public class DecoratorPatternDemo {
public static void main(String[] args) {
// 1. 单纯的黑咖啡
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " $" + beverage.cost());
// 2. 加双份摩卡和奶泡的浓缩咖啡
Beverage beverage2 = new Espresso();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
// 3. 加牛奶、豆浆和奶泡的综合咖啡
Beverage beverage3 = new HouseBlend();
beverage3 = new Milk(beverage3);
beverage3 = new Soy(beverage3);
beverage3 = new Whip(beverage3);
System.out.println(beverage3.getDescription() + " $" + beverage3.cost());
}
}
代码说明
- Beverage 接口 (Component):
- 定义饮料的基本操作:获取描述和计算价格
- 是所有具体饮料和装饰器的共同接口
- Espresso 和 HouseBlend 类 (ConcreteComponent):
- 实现 Beverage 接口
- 代表具体的基本饮料类型
- CondimentDecorator 抽象类 (Decorator):
- 实现 Beverage 接口
- 持有一个 Beverage 对象的引用(被装饰的对象)
- 是所有具体装饰器的基类
- Milk, Mocha, Soy, Whip 类 (ConcreteDecorator):
- 继承 CondimentDecorator
- 添加自己的描述和价格
- 委托被装饰对象完成其他操作
- DecoratorPatternDemo 类 (Client):
- 演示如何使用装饰器模式
- 创建基本饮料
- 用装饰器动态添加配料
- 输出最终饮料的描述和价格
输出示例
运行该程序将输出:
Espresso $1.99
Espresso, Mocha, Mocha, Whip $2.69
House Blend Coffee, Milk, Soy, Whip $1.34
装饰器模式特点
- 动态添加功能:可以在运行时动态地添加新的功能
- 避免类爆炸:不需要为每种组合创建子类
- 保持开放封闭原则:对扩展开放,对修改封闭
- 装饰顺序影响结果:装饰器的顺序会影响最终结果
这个示例展示了装饰器模式如何灵活地为对象添加功能,而不需要修改原有代码或创建大量子类。
Java 实现装饰器模式示例
623

被折叠的 条评论
为什么被折叠?



