Github:DecoratorPattern.java
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

  1. 定义接口,并实现基础功能 ```java /**
    • 定义接口 */ public interface Shape{ void draw(); }

/**

  • 矩形实现 */ public class Rectangle implements Shape{ @Override public void draw() {
    1. System.out.println("Shape: Rectangle");
    } }

/**

  • 圆形实现 */ public class Circle implements Shape{ @Override public void draw() {
    1. System.out.println("Shape: Circle");
    } } ```
  1. 测试输出 ```java public static void main(String[] args) { DecoratorPattern pattern = new DecoratorPattern(); pattern.decorator(); }

private void decorator() { Shape rect = new Rectangle(); // 装饰前:没有装饰 System.out.println(“装饰前:”); rect.draw(); }

  1. 输出结果:
  2. ```java
  3. 装饰前:
  4. Shape: Rectangle
  1. 现在需要额外的功能,设置形状线条的颜色。定义修饰抽象类

    1. /**
    2. * 现在需要额外装饰已有的形状,那么就定义一个装饰抽象类
    3. */
    4. public abstract class ShapeDecorator implements Shape{
    5. private Shape decorator;
    6. public ShapeDecorator(Shape decorator) {
    7. this.decorator = decorator;
    8. }
    9. @Override
    10. public void draw() {
    11. decorator.draw();
    12. }
    13. }
  2. 为修饰抽象类定义具体颜色实现类 ```java /**

    • 红色装饰实现类 */ public class RedShapeDecorator extends ShapeDecorator{ public RedShapeDecorator(Shape decorator) { super(decorator); }

      @Override public void draw() { super.draw(); setBorder(); }

      private void setBorder() { System.out.println(“额外功能:decorator: red color.”); } }

/**

  • 黑色装饰实现类 */ public class BlackShapeDecorator extends ShapeDecorator{ public BlackShapeDecorator(Shape decorator) {

    1. super(decorator);

    }

    @Override public void draw() {

    1. super.draw();
    2. setBorder();

    }

    private void setBorder() {

    1. System.out.println("额外功能:decorator: black color.");

    } } ```

  1. 测试装饰后效果 ```java public static void main(String[] args) { DecoratorPattern pattern = new DecoratorPattern(); pattern.decorator(); }

private void decorator() { Shape rect = new Rectangle(); // 装饰前:没有装饰 System.out.println(“装饰前:”); rect.draw();

  1. // 装饰后:
  2. System.out.println("装饰后:");
  3. Shape red = new RedShapeDecorator(rect);
  4. red.draw();

}

  1. 输出效果:
  2. ```java
  3. 装饰前:
  4. Shape: Rectangle
  5. 装饰后:
  6. Shape: Rectangle
  7. 额外功能:decorator: red color.

参考

菜鸟教程 - 装饰器模式