Java装饰者模式
1. 什么是装饰者模式?
装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许将对象的行为在运行时动态地添加到对象中,相比于继承,它更加灵活,可以避免类爆炸的问题。
2. 装饰者模式的实现原理
装饰者模式主要有以下几个角色:
- 抽象组件(Component):定义一个抽象接口,用于被装饰对象实现;
- 具体组件(ConcreteComponent):实现抽象组件接口,是被装饰对象的基本实现;
- 抽象装饰者(Decorator):继承抽象组件,持有一个被装饰对象的引用,在对被装饰对象的行为进行增强时,调用被装饰对象的相关方法然后进行扩展;
- 具体装饰者(ConcreteDecorator):继承抽象装饰者,实现其相应的方法,具体扩展被装饰对象的行为。
3. 代码示例
3.1 定义抽象组件
public interface Coffee {
String getIngredients();
double getPrice();
}
3.2 定义具体组件
public class Espresso implements Coffee {
@Override
public String getIngredients() {
return "Espresso";
}
@Override
public double getPrice() {
return 1.99;
}
}
3.3 定义抽象装饰者
public interface CoffeeDecorator extends Coffee {
String getIngredients();
double getPrice();
}
3.4 实现具体装饰者
public class MilkDecorator implements CoffeeDecorator {
private Coffee coffee;
public MilkDecorator(Coffee coffee) {
this.coffee = coffee;
}
@Override
public String getIngredients() {
return coffee.getIngredients() + ", Milk";
}
@Override
public double getPrice() {
return coffee.getPrice() + 0.5;
}
}
3.5 调用装饰者模式
public static void main(String[] args) {
// order a simple espresso
Coffee simpleEspresso = new Espresso();
System.out.println("Simple espresso: " + simpleEspresso.getIngredients() + " $" + simpleEspresso.getPrice());
// order a milk espresso
Coffee milkEspresso = new MilkDecorator(new Espresso());
System.out.println("Milk espresso: " + milkEspresso.getIngredients() + " $" + milkEspresso.getPrice());
}
输出结果:
Simple espresso: Espresso $1.99
Milk espresso: Espresso, Milk $2.49
4. 装饰者模式的优缺点
4.1 优点
- 可以动态地扩展一个对象的功能,而无需修改现有的代码;
- 可以将不同的装饰器组合在一起,实现更为复杂的功能扩展;
- 装饰器是对继承的有力补充,避免了继承所带来的“类爆炸”问题(即子类数量增加)。
4.2 缺点
- 使用装饰器模式会导致设计中出现许多小对象,如果过度使用,会使程序变得很复杂;
- 装饰器模式会导致程序运行的效率降低,开发人员需要权衡是否需要使用装饰器模式来扩展对象的功能。