装饰器模式(Decorator Pattern)是一种设计模式,它允许在运行时动态地给一个对象添加额外的功能,而不需要修改原始对象的结构。
在Java中,装饰器模式可以通过以下方式实现:
1. 创建一个接口(Component),定义了原始对象和装饰器对象的共同行为。
2. 创建一个具体的实现类(ConcreteComponent),实现了接口,并提供了原始对象的具体实现。
3. 创建一个装饰器类(Decorator),实现了接口,并包含一个对Component对象的引用。装饰器类可以在调用原始对象的方法之前或之后添加额外的功能。
4. 创建具体的装饰器类(具体的Decorator类),继承自装饰器类,并在调用原始对象的方法之前或之后添加特定的功能。
以下是一个简单的示例代码,演示了如何使用装饰器模式:
- // 接口
- interface Shape {
- void draw();
- }
-
- // 具体实现类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Drawing a circle");
- }
- }
-
- // 装饰器类
- abstract class ShapeDecorator implements Shape {
- protected Shape decoratedShape;
-
- public ShapeDecorator(Shape decoratedShape) {
- this.decoratedShape = decoratedShape;
- }
-
- @Override
- public void draw() {
- decoratedShape.draw();
- }
- }
-
- // 具体的装饰器类
- class RedShapeDecorator extends ShapeDecorator {
- public RedShapeDecorator(Shape decoratedShape) {
- super(decoratedShape);
- }
-
- @Override
- public void draw() {
- decoratedShape.draw();
- setRedBorder();
- }
-
- private void setRedBorder() {
- System.out.println("Setting red border");
- }
- }
-
- // 客户端
- public class Main {
- public static void main(String[] args) {
- Shape circle = new Circle();
- Shape redCircle = new RedShapeDecorator(new Circle());
-
- circle.draw();
- System.out.println("---");
- redCircle.draw();
- }
- }
在这个示例中,Shape接口定义了原始对象和装饰器对象的共同行为。Circle类是具体的实现类,实现了Shape接口,并提供了原始对象的具体实现。
ShapeDecorator类是装饰器类,实现了Shape接口,并包含一个对Component对象的引用。在draw方法中,装饰器类调用原始对象的draw方法。
RedShapeDecorator类是具体的装饰器类,继承自装饰器类,并在调用原始对象的draw方法之前或之后添加特定的功能。在这个示例中,RedShapeDecorator类在调用原始对象的draw方法之后,添加了设置红色边框的功能。
在客户端中,通过实例化具体的装饰器类来使用装饰器模式。客户端可以选择性地添加多个装饰器,以实现不同的功能组合。
装饰器模式允许在运行时动态地给一个对象添加额外的功能,而不需要修改原始对象的结构。这提供了更大的灵活性和可扩展性,同时遵循了开闭原则。