装飾図案


緒論


装飾師の意味は装飾、装飾です.
したがって、Pythonは関数を実行する前に使用できるように修飾します.
まったく違うが意味が近いJavaを使って装飾図案を持っている.
例えば,カーナビに道路を表示する機能(カメラ位置,速度制限の取り締まり)を考える.


public class RoadDisplay {

    public void draw() { System.out.println("기본 도로 표시"); }
}
ユーザーが車線を表示したい場合、機能を開きたい場合はどうすればいいですか?
public class RoadDisplayWithLane extends RoadDisplay {
    public void draw() {
        super.draw();
        drawLane();
    }
    
    private void drawLane() {
        System.out.println("차선 표시");
    }
}
RoadDisplayを継承して車線表示機能を追加できます.
しかし周囲の交通量を観察するために機能を増やせば
また、RoadDisplayを継承して新しいクラスを作成する必要があります.
これにより、必要なすべての機能のすべての組合せのクラスを作成する必要があるという問題が発生します.
これらの不要なコードを除去するために,デコーダモードが現れた.

本題


これらのプロパティの共通点は、表示に表示されます.
public abstract class Display {
    public abstract void draw();
}
このクラスを抽象クラスにする.
最も基本的な機能を記述する抽象クラスをComponentと呼ぶ.
「構成部品」(Component)とは、プログラミングで再利用可能な各独立したモジュールを指す。

このコンポーネントを実装するエンティティを示します.
public class RoadDisplay extends Display{

    @Override
    public void draw() {
       System.out.println("기본 도로 표시");
    }
}
以上のキャラクター名はConcreteComponentです.
実際の実施者.
コンテンツコンポーネント:独立モジュールの実装

次に、Decoratorを修飾ロールに関連付けるクラスを作成します.
package decorator;

public class DisplayDecorator extends Display{
    private Display decoratedDisplay;

    public DisplayDecorator(Display decoratedDisplay) {
        this.decoratedDisplay = decoratedDisplay;
    }

    @Override
    public void draw() {
        this.decoratedDisplay.draw();
    }
}
最上位表示をsetterとして注入し、正確には受信した表示(抽象)が表示の実装をインポートして関数を実行する.
オブジェクトを注入し、注入オブジェクトの関数を呼び出すことが重要です.
上記のように、Decoratorと呼ばれています.
次に、ユーザが車線を表示したい上記の例を使用します.

public class LaneDecorator extends DisplayDecorator{

    public LaneDecorator(Display decoratedDisplay) {
        super(decoratedDisplay);
    }

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

    private void drawLane() {
        System.out.println("차선표시");
    }
}
継承ジェネレータのDisplayDecoratorジェネレータを呼び出してオブジェクトを注入します.
独自のdraw()を再定義して独自の論理を追加すればよい.
これはConcreteDecoratorと呼ばれています. public void draw()super.draw()前後の関数を装飾(装飾)するために、さらに独自の作業を実施することができます.
なぜ今Decorateが貼られているのか理解できますか?
クライアント呼び出しを記述するコードはこうです.
        Display roadWithLine = new LaneDecorator(new RoadDisplay());
        roadWithLine.draw();
        
        // 기본 도로 표시 
        // 차선표시
上記のトラフィック機能を追加したい場合は、どうなりますか?
public class TrafficDecorator extends DisplayDecorator{
    public TrafficDecorator(Display decoratedDisplay) {
        super(decoratedDisplay);
    }

    @Override
    public void draw() {
        super.draw();
        drawTraffic();
    }
    private void drawTraffic() {
         System.out.println("트래픽그리기");
    }
}
前述のように、ConcreteDecoratorのキャラクターを追加すればよい.
合計3つの機能のトラフィックを表示し、デフォルトの道路を表示し、車線を表示する機能を呼び出すには、次の手順に従います.
        Display trafficRoadWithLine = new TrafficDecorator(new LaneDecorator(new RoadDisplay()));
        trafficRoadWithLine.draw();
        //기본 도로 표시
        //차선표시
        //트래픽그리기 
 
これにより、複数の組合せクラスを作成する必要がなくなり、Decoratorはコードの無駄を減らし、より読み取り可能なコードを使用することができます.

整理する


Component
  • 表示クラス(draw抽象概念)
  • ConcreteComponent
  • RoadDisplayクラス(実表示)
  • Decorator
  • DisplayDecoratorクラス(コンポーネントと機密Decorator接続ロール)
  • ConcreteDecorator
  • TransformanceDecoratorクラス、LaneDecoratorクラス(追加された責任論理ロール)