一、简介
装饰器模式是一种结构型设计模式,它允许向现有对象动态地添加新功能,同时又不改变其结构。它通过创建包装对象来包裹原始类,在不改变其接口的情况下,为对象添加新的行为或责任。
装饰器模式通常包含以下角色:
- Component(组件) :定义了一个对象接口,可以动态地添加新的功能。
- ConcreteComponent(具体组件) :实现了组件接口,是被装饰的类。
- Decorator(装饰器抽象类) :实现了组件接口,并持有一个对组件对象的引用,在其内部包装组件对象,可以动态地为组件添加新的功能。
- ConcreteDecorator(具体装饰器类) :继承自装饰器抽象类,具体实现了装饰功能,可以添加具体的行为。
二、装饰器模式
2.1、组件信息
假设我们有一个形状的接口,它有一个画形状的方法
public interface Shape {
// 画一个形状
void draw();
}
2.2、具体组件信息
圆形组件和方形组件实现了上面的接口,代码如下:
// 具体的形状类 - 圆形
public class Circle implements Shape {
public void draw() {
System.out.println("画了一个圆形:Circle");
}
}
// 具体的形状类 - 方形
public class Square implements Shape {
public void draw() {
System.out.println("画了一个方形:Square");
}
}
2.3、颜色装饰器抽象类
// 装饰器抽象类
abstract class ColorDecorator implements Shape {
protected Shape decoratedShape;
protected String color;
public ColorDecorator(Shape decoratedShape, String color) {
this.decoratedShape = decoratedShape;
this.color = color;
}
public void draw() {
decoratedShape.draw();
System.out.println("装饰一个颜色: " + color);
}
}
2.4、颜色装饰器实现类
// 圆形颜色装饰器
public class CircleColorDecorator extends ColorDecorator {
public CircleColorDecorator(Shape decoratedShape, String color) {
super(decoratedShape, color);
}
}
// 方形颜色装饰器
public class SquareColorDecorator extends ColorDecorator {
public SquareColorDecorator(Shape decoratedShape, String color) {
super(decoratedShape, color);
}
}
三、使用
3.1、测试
public class DecoratorPatternExample {
public static void main(String[] args) {
System.out.println("---------------------基础形状-------------------------");
// 创建基础圆形
Shape circle = new Circle();
circle.draw();
// 创建基础方形
Shape square = new Square();
square.draw();
System.out.println("---------------------圆形形状(带颜色)-------------------------");
// 装饰成红色的圆形
Shape redCircle = new CircleColorDecorator(new Circle(),"red");
redCircle.draw();
// 装饰成蓝色的圆形
Shape blueCircle = new CircleColorDecorator(new Circle(),"blue");
blueCircle.draw();
System.out.println("---------------------方形形状(带颜色)-------------------------");
// 装饰成红色的圆形
Shape redSquare = new SquareColorDecorator(new Square(),"red");
redSquare.draw();
// 装饰成蓝色的方形
Shape blueSquare = new SquareColorDecorator(new Square(),"blue");
blueSquare.draw();
}
}
运行结果:
---------------------基础形状-------------------------
画了一个圆形:Circle
画了一个方形:Square
---------------------圆形形状(带颜色)-------------------------
画了一个圆形:Circle
装饰一个颜色: red
画了一个圆形:Circle
装饰一个颜色: blue
---------------------方形形状(带颜色)-------------------------
画了一个方形:Square
装饰一个颜色: red
画了一个方形:Square
装饰一个颜色: blue
3.2、优缺点
优点:
- 动态性 : 可以动态地添加或移除对象的功能,不需要修改已有代码。
- 灵活性 : 可以通过不同的装饰器组合来实现不同的效果,使得扩展变得更加灵活。
- 遵循开闭原则 : 装饰器模式允许在不修改现有代码的情况下,扩展对象的功能,符合开闭原则。
缺点:
- 过多的对象 : 可能会导致系统中出现大量的具体装饰器类,增加了对象数量,使得代码复杂性增加。
- 固定装饰层次 : 当装饰器层次固定时,对于动态地添加新功能有一定的限制,因为需要预先定义好不同的装饰器组合。
总的来说,装饰器模式是一种灵活且可扩展的模式,它允许在运行时动态地添加新功能,而无需改变现有对象的结构,这使得代码更具灵活性和可维护性。