デザインパターン:デコレータパターン

意図:オブジェクトにいくつかの追加の責任を動的に追加すること。デコレータパターンは、機能の追加という点でサブクラス化よりも柔軟性があります。

主な解決策:一般に、クラスを拡張するために、継承を使用して実装することがよくあります。継承はクラスに静的機能を導入し、拡張関数の増加に伴い、サブクラスは非常に膨張します。

使用する場合:多くのサブクラスを追加せずにクラスを拡張します。

それを解決する方法:特定の機能的責任を分割し、同時にデコレータパターンを継承します。

キーコード:1。Componentクラスは抽象的な役割として機能するため、具体的に実装しないでください。2.変更されたクラスは、Componentクラスを参照および継承し、特定の拡張クラスが親クラスのメソッドをオーバーライドします。

ここに画像の説明を挿入
インターフェイスを作成します。

Shape.java

public interface Shape {
    
    
   void draw();
}

ステップ2
インターフェイスを実装するエンティティクラスを作成します。

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");
   }
}

ステップ
3Shapeインターフェイスを実装する抽象デコレータクラスを作成します。

ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
    
    
   protected Shape decoratedShape;
 
   public ShapeDecorator(Shape decoratedShape){
    
    
      this.decoratedShape = decoratedShape;
   }
 
   public void draw(){
    
    
      decoratedShape.draw();
   }  
}

ステップ
4ShapeDecoratorクラスを拡張するエンティティデコレータクラスを作成します。

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");
   }
}

ステップ
5RedShapeDecoratorを使用して、Shapeオブジェクトを装飾します。

DecoratorPatternDemo.java

public class DecoratorPatternDemo {
    
    
   public static void main(String[] args) {
    
    
 
      Shape circle = new Circle();
      ShapeDecorator redCircle = new RedShapeDecorator(new Circle());
      ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle());
      //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();
   }
}

おすすめ

転載: blog.csdn.net/david2000999/article/details/121613976