设计模式 装饰器模式

  • 设计模式 - 装饰器模式

    装饰器模式允许用户向现有对象添加新功能,而无需更改其结构。这种设计模式属于结构模式,因为该模式充当现有类的包装。此模式创建一个包装原始类的装饰器类,并提供其他功能,以保持类方法的签名完整。我们通过以下示例演示装饰器模式的使用,在该示例中,我们将使用某种颜色装饰形状而不改变形状类别。
  • 实例

    我们将创建一个Shape接口和实现Shape接口的具体类。然后,我们将创建一个抽象装饰器类ShapeDecorator,该类实现Shape接口并将Shape对象作为其实例变量。
    RedShapeDecorator是实现ShapeDecorator的具体类。
    DecoratorPatternDemo,我们的演示类将使用RedShapeDecorator装饰Shape对象。
    dp
    第1步 - 创建一个接口。Shape.java
    
    public interface Shape {
       void draw();
    }
    
    第2步 - 创建实现相同接口的具体类。 Rectangle.java , Circle.java
    
    public class Rectangle implements Shape {
    
       @Override
       public void draw() {
          System.out.println("Shape: Rectangle");
       }
    }
    
    
    public class Circle implements Shape {
    
       @Override
       public void draw() {
          System.out.println("Shape: Circle");
       }
    }
    
    第3步 - 创建实现Shape接口的抽象装饰器类。 ShapeDecorator.java
    
    public abstract class ShapeDecorator implements Shape {
       protected Shape decoratedShape;
    
       public ShapeDecorator(Shape decoratedShape){
          this.decoratedShape = decoratedShape;
       }
    
       public void draw(){
          decoratedShape.draw();
       }    
    }
    
    步骤4 - 创建扩展混凝土装饰类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");
       }
    }
    
    第5步 使用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();
       }
    }
    
    第6步 - 验证输出。
    
    Circle with normal border
    Shape: Circle
    
    Circle of red border
    Shape: Circle
    Border Color: Red
    
    Rectangle of red border
    Shape: Rectangle
    Border Color: Red