装饰器模式允许用户在不改变其结构的情况下向现有对象添加新功能.这种类型的设计模式属于结构模式,因为此模式充当现有类的包装.
此模式创建一个装饰器类,它包装原始类并提供保持类方法签名的附加功能完整.
我们通过以下示例展示装饰器模式的使用,其中我们将使用一些颜色装饰一个没有改变形状类的形状.
我们将创建一个 Shape 接口和实现 Shape 接口的具体类.然后,我们将创建一个抽象装饰器类 ShapeDecorator ,实现 Shape 接口并将 Shape 对象作为其实例变量.
RedShapeDecorator 是实现 ShapeDecorator 的具体类.
DecoratorPatternDemo ,我们的演示类将使用 RedShapeDecorator 来装饰 Shape 对象.
创建一个界面.
Shape.java
public interface Shape { void draw(); }
创建实现相同界面的具体类.
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Shape: Rectangle"); } }
Circle.java
public class Circle implements Shape { @Override public void draw() { System.out.println("Shape: Circle"); } }
创建实现的抽象装饰器类形状界面.
ShapeDecorator.java
public abstract class ShapeDecorator implements Shape { protected Shape decoratedShape; public ShapeDecorator(Shape decoratedShape){ this.decoratedShape = decoratedShape; } public void draw(){ decoratedShape.draw(); } }
创建扩展的具体装饰器类ShapeDecorator 类.
RedShapeDecorator.java
public class RedShapeDecorator extends ShapeDecorator { public RedShapeDecorator(Shape decoratedShape) { super(decoratedShape); } @Override public void draw() { decoratedShape.draw(); setRedBorder(decoratedShape); } private void setRedBorder(Shape decoratedShape){ System.out.println("Border Color: Red"); } }
使用 RedShapeDecorator 装饰 Shape 对象.
DecoratorPatternDemo.java
public class DecoratorPatternDemo { public static void main(String[] args) { Shape circle = new Circle(); Shape redCircle = new RedShapeDecorator(new Circle()); Shape redRectangle = new RedShapeDecorator(new Rectangle()); System.out.println("Circle with normal border"); circle.draw(); System.out.println("\nCircle of red border"); redCircle.draw(); System.out.println("\nRectangle of red border"); redRectangle.draw(); } }
验证输出.
Circle with normal border Shape: Circle Circle of red border Shape: Circle Border Color: Red Rectangle of red border Shape: Rectangle Border Color: Red