Java装饰者模式

1 Java装饰者模式的介绍

装饰者模式允许用户向现有对象添加新功能而不改变其结构。 这种类型的设计模式属于结构模式,因为此模式充当现有类的包装器。

此模式创建一个装饰器类,它包装原始类并提供附加功能,保持类方法签名完整。

我们通过以下示例展示装饰器模式的使用,其中我们将用一些颜色装饰形状而不改变形状类。

2 Java装饰者模式好处

  • 装饰者模式提供了比静态继承更大的灵活性。
  • 因为可以通过对新类进行编码来进行更改,所以可以增强对象的可扩展性。
  • 装饰者模式允许您从目标类开发一系列功能,而不是将所有行为编码到对象中,从而简化了编码。

3 Java装饰者模式的用法

  • 当您想透明,动态地向对象添加职责而又不影响其他对象时。
  • 当您想向对象添加职责时,将来可能需要更改。
  • 通过子类扩展功能不再可行。

4 Java装饰者模式的UML

在这个实例中,将创建一个Shape接口和实现Shape接口的具体类。然后再创建一个抽象装饰器类-ShapeDecorator,实现Shape接口并使用Shape对象作为其实例变量。

这里的RedShapeDecorator是实现ShapeDecorator的具体类。

DecoratorPatternDemo这是一个演示类,将使用RedShapeDecorator来装饰Shape对象。

5 Java装饰者模式的案例

5.1 创建一个简单的接口

Shape.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
public interface Shape {
   void draw();
}

5.2 创建两个实现相同接口的具体类

Rectangle.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Rectangle");
   }
}

Circle.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Shape: Circle");
   }
}

5.3 创建实现Shape接口的抽象装饰器类

ShapeDecorator.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
public abstract class ShapeDecorator implements Shape {
   protected Shape decoratedShape;

   public ShapeDecorator(Shape decoratedShape){
      this.decoratedShape = decoratedShape;
   }

   public void draw(){
      decoratedShape.draw();
   }
}

5.4 创建扩展ShapeDecorator类的具体装饰器类

RedShapeDecorator.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
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.5 使用RedShapeDecorator装饰Shape对象

DecoratorPatternDemo.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
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();
   }
}

5.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

 

热门文章

优秀文章