装饰者模式
装饰者模式
装饰者模式(Decorator Pattern)是一种结构型设计模式,主要用于动态地给对象添加额外的功能,而不改变其结构。这个模式通过创建一个装饰类来包装原始对象,从而扩展其功能。
主要角色
- 组件(Component):定义一个接口或抽象类,声明可以被装饰的对象所共有的接口。
- 具体组件(ConcreteComponent):实现了组件接口的具体类,代表需要装饰的对象。
- 装饰者(Decorator):持有一个组件对象的引用,并实现组件接口。装饰者可以在调用原始组件的方法之前或之后,添加额外的功能。
- 具体装饰者(ConcreteDecorator):继承自装饰者,具体实现要添加的功能。
结构示例
假设你有一个简单的 Coffee 类,想要动态地给它添加不同的配料,比如牛奶或糖。你可以通过装饰者模式来实现。
-
组件接口
Beveragepublic interface Beverage { String getDescription(); double cost(); } -
具体组件
Coffeepublic class Coffee implements Beverage { @Override public String getDescription() { return "Coffee"; } @Override public double cost() { return 2.00; } } -
装饰者基类
BeverageDecoratorpublic abstract class BeverageDecorator implements Beverage { protected Beverage beverage; public BeverageDecorator(Beverage beverage) { this.beverage = beverage; } @Override public abstract String getDescription(); } -
具体装饰者
MilkDecoratorpublic class MilkDecorator extends BeverageDecorator { public MilkDecorator(Beverage beverage) { super(beverage); } @Override public String getDescription() { return beverage.getDescription() + ", Milk"; } @Override public double cost() { return beverage.cost() + 0.50; // 假设牛奶的费用是 $0.50 } } -
具体装饰者
SugarDecoratorpublic class SugarDecorator extends BeverageDecorator { public SugarDecorator(Beverage beverage) { super(beverage); } @Override public String getDescription() { return beverage.getDescription() + ", Sugar"; } @Override public double cost() { return beverage.cost() + 0.25; // 假设糖的费用是 $0.25 } } -
测试类
TestDecoratorPatternpublic class TestDecoratorPattern { public static void main(String[] args) { // 创建一个基础的咖啡对象 Beverage coffee = new Coffee(); System.out.println("Description: " + coffee.getDescription()); // Output: Coffee System.out.println("Cost: $" + coffee.cost()); // Output: 2.00 // 添加牛奶装饰 Beverage milkCoffee = new MilkDecorator(coffee); System.out.println("Description: " + milkCoffee.getDescription()); // Output: Coffee, Milk System.out.println("Cost: $" + milkCoffee.cost()); // Output: 2.50 // 添加糖装饰 Beverage milkSugarCoffee = new SugarDecorator(milkCoffee); System.out.println("Description: " + milkSugarCoffee.getDescription()); // Output: Coffee, Milk, Sugar System.out.println("Cost: $" + milkSugarCoffee.cost()); // Output: 2.75 } }
解释
- 组件接口
Beverage定义了所有饮料的基本接口,包括获取描述和计算费用的方法。 - 具体组件
Coffee实现了Beverage接口,提供了基础的咖啡描述和费用。 - 装饰者基类
BeverageDecorator维护了一个Beverage对象的引用,并实现了Beverage接口,但getDescription方法是抽象的,具体装饰者需要实现它。 - 具体装饰者
MilkDecorator和SugarDecorator实现了BeverageDecorator,分别添加了牛奶和糖的描述和费用。 - 测试类
TestDecoratorPattern演示了如何使用装饰者模式来动态地添加功能,并打印了结果。
通过装饰者模式,可以灵活地组合和扩展对象的功能,而不需要修改对象的原始代码。

浙公网安备 33010602011771号