「デザインPattern」装飾図案


装飾図案

  • 構造モード
  • オブジェクト組合せモード
  • 、動的拡張機能を許可
  • 基本機能に多くの機能を追加できる場合、各追加機能をDecoratorクラスとして定義し、必要なDecoratorオブジェクトを組み合わせることによって追加機能の組合せを設計することができる:
  • .

    こうぞう


  • Component
  • 基本機能の「コンテンツコンポーネント」と「Decorator」の共通機能を定義する「追加機能」.
  • クライアントは、コンポーネントを介して実オブジェクト
  • を使用する.
  • ConcreteComponent
  • 基本機能類
  • Decorator
  • は、多数の特定のDecoratorの汎用機能
  • を提供する.
  • ConcreteDecoratorA, ConcreteDecoratorB
  • Decoratorのサブクラスは、基本機能に追加された独立機能
  • である
  • ConcreteDecoratorクラスは、DecoratorクラスからComponentクラスへの「合成」関係によって表されるConcreteComponentオブジェクトへの参照が必要です.
  • 合成関係
  • の作成者でフィールドにオブジェクトを作成した場合、
  • になります.
  • すべてのオブジェクトのライフサイクルと一部のオブジェクトのライフサイクルは互いに依存している.
  • 、つまり、オブジェクト全体が見えなくなった場合、一部のオブジェクトも見えなくなります.
  • インプリメンテーション


    道しるべの方法を実施してみましょう.
    Display.class
    public abstract class Display {
    
        public abstract void draw();
    
    }
  • 道路標識を実現する方法
  • を定義する.
    RoadDisplay.class
    public class RoadDisplay extends Display{
        public void draw() { System.out.println("기본 도로 표시"); }
    }
  • 基本道路表示方法を実現する機能クラス
  • DisplayDecorator.class
    public abstract class DisplayDecorator extends Display {
        private Display decoratedDisplay;
    
        public DisplayDecorator(Display decoratedDisplay) {
            this.decoratedDisplay = decoratedDisplay;
        }
    
        @Override
        public void draw() { decoratedDisplay.draw(); }
    }
    
  • は、デフォルトの道路表示機能ではなく追加の表示機能が必要な場合にクラスの組合せに使用するDecoratorクラス
  • を定義する.
    LaneDecorator.class
    public class LaneDecorator extends DisplayDecorator {
    
        public LaneDecorator(Display decoratedDisplay) { super(decoratedDisplay); }
    
        @Override
        public void draw() {
            super.draw(); // 설정된 기존 표시 기능을 수행
            drawLane(); // 추가적으로 차선을 표시
        }
    
        // 차선 표시 기능만 직접 제공
        private void drawLane() { System.out.println("\t차선 표시"); }
    }
    
    
    TrafficDecorator.class
    
    public class TrafficDecorator extends DisplayDecorator {
    
        public TrafficDecorator(Display decoratedDisplay) { super(decoratedDisplay); }
    
        @Override
        public void draw() {
            super.draw(); // 설정된 기존 표시 기능을 수행
            drawTraffic(); // 추가적으로 교통량을 표시
        }
    
        // 교통량 표시 기능만 직접 제공
        private void drawTraffic() { System.out.println("\t교통량 표시"); }
    }
    
  • クラス合成の組合せに使用する交通量および車線識別クラス
  • を定義する.
    Main.class
        public static void main(String[] args) {
            Display roadWithLaneAndTraffic =
                    new TrafficDecorator(
                            new LaneDecorator(
                                    new RoadDisplay()));
            roadWithLaneAndTraffic.draw();
        }
    >>> 기본 도로 표시
    	차선 표시
    	교통량 표시
  • Mainでは、クラスの組合せを使用して表示順序を定義できます.
  • 最初に作成したRoadDisplayオブジェクトの描画方法
  • を実行します.
  • 最初の付加機能TrafficeDecoratorクラスのdrawTrafficeメソッド実行
  • LaneDecoratorクラスを実行するdrawLaneメソッド

  • クライアントクラスは、同じ表示クラスでのみ道路情報を一貫して表示できます.

    メリットとデメリット

  • の利点
  • 付加機能の組合せの各クラスは、各付加機能のクラスのオブジェクトではなく、実装することができる.
  • オブジェクトに機能を動的に簡単に追加できます.
  • の欠点
  • クラスが増加するにつれて、クラスが多くなる可能性があります.
  • オブジェクトの正体を知るのは難しく、複雑になる可能性があります.
  • 関連項目:
  • [ჸჸჸჸჸჸჸჸჸ????????,Decorator(Decorator)
  • [Patternを設計]アクセサリ配列: