目录
- 一、简介
- 二、装饰器模式
- 2.1、组件信息
- 2.2、具体组件信息
- 2.3、颜色装饰器抽象类
- 2.4、颜色装饰器实现类
- 三、使用
- 3.1、测试
- 3.2、优缺点
一、简介
装饰器模式是一种结构型设计模式,它允许向现有对象动态地添加新功能,同时又不改变其结构。它通过创建包装对象来包裹原始类,在不改变其接口的情况下,为对象添加新的行为或责任。
装饰器模式通常包含以下角色:
- 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、优缺点
优点:
- 动态性 : 可以动态地添加或移除对象的功能,不需要修改已有代码。
- 灵活性 : 可以通过不同的装饰器组合来实现不同的效果,使得扩展变得更加灵活。
- 遵循开闭原则 : 装饰器模式允许在不修改现有代码的情况下,扩展对象的功能,符合开闭原则。
缺点:
- 过多的对象 : 可能会导致系统中出现大量的具体装饰器类,增加了对象数量,使得代码复杂性增加。
- 固定装饰层次 : 当装饰器层次固定时,对于动态地添加新功能有一定的限制,因为需要预先定义好不同的装饰器组合。
总的来说,装饰器模式是一种灵活且可扩展的模式,它允许在运行时动态地添加新功能,而无需改变现有对象的结构,这使得代码更具灵活性和可维护性。