[デザインモード]Decorator Pattern,装飾モード

4058 ワード

背景(Why)


図書館のニュースをユーザーに伝えるプログラムがあります.
最初の要求事項のうち、1つだけが電子メールです.

さらに、伝え方にFacebook、Slackが追加されました.

サブクラスとして、追加の要件が反映されます.
これにより、1人のユーザが複数のNotifierを持つことができるようになる.

すべての組み合わせはサブクラスに置かれています...複雑すぎて、1つのクラスには多くの責任があって、SRPに背いています!どのように改善しますか?

How

상속で追加の要件を解決しようとした結果、このような問題が発生した.継承には次の問題があります.
  • 静止.したがって、実行時にオブジェクトの動作を変更することはできません.そうする場合は、objectを他のサブクラスに変換します.
  • の動作に対して複数のレベルを継承することはできません.
  • これをCompositionまたはAggregationに解決します!
  • の組み合わせ:WrapperとWrappedは同じライフサイクルを有する.
  • // 전체 생성
    Person person = new Person();
    // 전체 생성자 내
    Person() { heart = new Heart(); }
  • 集約:それぞれ異なるライフサイクルがあります.
  • Heart heart = new Heart();
    Person person = new Person(heart);
    実装に使用することを考えてみましょう.
  • Wrapperは、Wrappedと同じインタフェースを実現する.
  • Wrapperは、そのインタフェースをメンバー変数として使用します.
  • このように実施すると、
  • WrappedクラスのNotifierは運転時に交換できます!
  • クラスが1つずつ参照される場合、複数のクラスの動作は、(チェーン)委任(委任)によって使用できます.
  • What


    上記のDecorator Pattern.
    特定の状況と用途に応じて、オブジェクトに責任を追加するモード.

  • コンポーネント:Wrapper,Wrappedクラスが実施するCommon Interface
  • 秘密保持コンポーネント:Wrapの基本機能
  • Base Decorator:Wrapped class.Wrappedクラスのタイプをコンポーネントとして、Concrete ComponentとDecoratorsを参照できます.また、Wrapped Objectには、入力されたすべての演算が委任されます.
  • 秘密Decorators:コンポーネントに追加する動作を定義する
  • いつ使いますか。(When)


    実行時に
  • の追加動作を構成する必要がある場合
    ビジネスロジックを階層化して、実行時に複数の組合せのロジックを構成できます.
  • 継承で問題を解決できません
    finalキーワードなどの
  • を使用

    Pros

  • SRPを満たす.
  • オブジェクトの責任を実行時に加算し、取り外します.
  • の複数の動作を組み合わせることができる.
  • Con


    一度ではWrappedを消すのは容易ではありません!

    実際の使用例


    Java I/Oで使用します.

    Gzippedファイルにシーケンス化されたJavaオブジェクトがあり、迅速な読み取りが必要であるとします.
  • inputstreamを開きます.
  • FileInputStream fis = new FileInputStream("/objects.gz");
    バッファを使用して
  • を加速します.
  • BufferedInputStream bis = new BufferedInputStream(fis);
  • gzippedファイルを使用するため、解凍します.
  • GzipInputStream gis = new GzipInputStream(bis);
  • ローンをキャンセルします.
  • ObjectInputStream ois = new ObjectInputStream(gis);
    このような次から次へと責任を負って、以下のように使います!
    SomeObject someObject = (SomeObject) ois.readObject();
    状況に応じて自由にstreamを飾ることが確認できます!

    ref


    https://refactoring.guru/design-patterns/decorator
    https://www.google.com/url?sa=i&url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FDecorator_pattern&psig=AOvVaw1UpIvHdtHYw7QbovWyFivp&ust=1617199397826000&source=images&cd=vfe&ved=0CAkQjhxqFwoTCNCbp7GX2O8CFQAAAAAdAAAAABAP
    https://stackoverflow.com/questions/6366385/use-cases-and-examples-of-gof-decorator-pattern-for-io