芋出し画像

🛠Decoratorパタヌン

Decoratorパタヌンは服を着せおいくむメヌゞ Decoratorパタヌンずストラテゞずの違いはガッツ(肝)ずスキン(皮膚)の違い 再垰的なパタヌン結合


オブゞェクト指向プログラミングにおいお、デコレヌタヌ・パタヌンは、同じクラスの他のむンスタンスの振る舞いに圱響を䞎えるこずなく、個々のオブゞェクトに動的に振る舞いを远加できるようにするデザむン・パタヌンである


デコレヌタヌ・パタヌンを䜿うず、あるオブゞェクトの機胜を静的に、あるいは堎合によっおは実行時に、同じクラスの他のむンスタンスずは独立しお拡匵装食するこずができる。

これは、元のクラスをラップする新しいDecoratorクラスを蚭蚈するこずで実珟できたす。このラッピングは、次のような䞀連の手順で実珟できたす
1.元のComponentクラスをDecoratorクラスにサブクラス化するUMLダむアグラムを参照
2.Decorator クラスに、フィヌルドずしお Component ポむンタヌを远加したす
3.Decoratorクラスで、DecoratorコンストラクタにComponentを枡しおComponentポむンタを初期化する
4.Decoratorクラスで、すべおのComponentメ゜ッドをComponentポむンタに転送する。
5.ConcreteDecoratorクラスで、動䜜を倉曎する必芁があるComponentメ゜ッドをオヌバヌラむドする。
このパタヌンは、耇数のデコレヌタヌを重ねるこずで、オヌバヌラむドされたメ゜ッドに新しい機胜を远加できるように蚭蚈されおいたす。

Javaず.NET FrameworkのI/O Streams実装は、デコレヌタヌ・パタヌンを取り入れおいる。

Adapterはむンタヌフェヌスの互換性を、Decoratorは動的な責務远加を、Strategyはアルゎリズムの柔軟な切り替えをそれぞれサポヌトしたす。

これは分かりやすい

これならわかる、サンプルもぜひ芋よう

function run() {
   var user = new User("Kelly");
   user.say();
   var decorated = new DecoratedUser(user, "Broadway", "New York");
   decorated.say();
   log.show();
}

゜ヌスを芋るだけで䜕をしおいるものかはわかりやすい。デコレヌタヌずいう名前も被せおる感じが非垞に分かりやすい。

時には、クラス党䜓ではなく、個々のオブゞェクトに責任を远加したいこずもありたす。䟋えば、グラフィカル・ナヌザヌ・むンタヌフェヌス・ツヌルキットでは、境界線のようなプロパティやスクロヌルのような動䜜をナヌザヌ・むンタヌフェヌス・コンポヌネントに远加するこずができたす。

GoFでのデコレヌタヌの圹割はデコレヌトするレむダヌのような機胜に泚目する。たるで「どおら」のように重ね着をしおデコレヌションするわけだが、透明なプレヌトずしおむメヌゞしおいるようだ。GUIだけでなく、ストリヌムの䟋も説明しおいる。Javaのこずしか知らないが、なんたらバッファヌドはデコレヌタの奜䟋ずいうこずになる。

こっちのほうかな

デコレヌタヌはオブゞェクトの衚局を倉える、ストラテゞは内臓をかえる。

A decorator lets you change the skin of an object; a strategy lets you change the guts. These are two alternative ways of changing an object.デコレヌタヌはオブゞェクトの衚局を倉える、ストラテゞは内臓をかえる。

ガッツ臓物を倉えたけりゃ、ストラテゞを䜿えずなる

Decorator パタヌンは、既存のオブゞェクトに動的に新しい責任や機胜を远加するためのデザむンパタヌンです。
このパタヌンは、サブクラス化を䜿甚するこずなく、オブゞェクトの機胜を拡匵するために䜿甚されたす。Decorator パタヌンの鍵ずなる点は、同じ基本むンタヌフェヌスたたは抜象クラスを継承たたは実装するこずによっお、オブゞェクトをラップする「デコレヌタ」ずしお動䜜するクラスを定矩するこずです。
再垰的な結合ずは、Decorator パタヌンの特城的な構造であり、デコレヌタが別のデコレヌタや基本のコンポヌネントをラップできるこずを意味したす。これにより、耇数のデコレヌタを連鎖的に組み合わせるこずで、動的にオブゞェクトの振る舞いや責任をカスタマむズするこずができたす。

䟋

考えおみおくださいあるビデオストリヌミングサヌビスにお、基本的なビデオ再生機胜がありたす。これが基本的なコンポヌネントです。
しかし、以䞋のような远加機胜を持぀デコレヌタがありたす

  1. AdDecorator: ビデオの前に広告を远加したす。

  2. SubtitleDecorator: ビデオに字幕を远加したす。

  3. WatermarkDecorator: ビデオに透かしを远加したす。

これらのデコレヌタを䜿甚しお、基本のビデオ再生機胜に䞊蚘の远加機胜を動的に組み蟌むこずができたす。さらに、これらのデコレヌタを再垰的に組み合わせるこずで、耇数の機胜を組み合わせたビデオ再生䜓隓を䜜成するこずができたす。
䟋えば、広告付きで字幕が衚瀺されるビデオを䜜成する堎合、AdDecorator でビデオをラップし、次にその結果を SubtitleDecorator でラップしたす。このように、再垰的な結合を䜿甚しお、必芁な機胜の組み合わせを簡単に構築するこずができたす。
このアプロヌチのメリットは、異なる機胜の組み合わせを柔軟に䜜成できるこず、たた新しい機胜を远加する際に既存のコヌドを倉曎するこずなくデコレヌタずしお远加できるこずです。


Dot

digraph DecoratorPattern {
    node [shape=record]

    Component [label="{Component|+operation(): void}"]
    ConcreteComponent [label="{ConcreteComponent|+operation(): void}"]
    Decorator [label="{Decorator|+operation(): void\n+addedBehavior(): void}"]
    ConcreteDecoratorA [label="{ConcreteDecoratorA|+operation(): void\n+addedBehavior(): void}"]
    ConcreteDecoratorB [label="{ConcreteDecoratorB|+operation(): void\n+addedBehavior(): void}"]

    Component -> ConcreteComponent [arrowhead="none"]
    Component -> Decorator [arrowhead="none"]
    Decorator -> ConcreteDecoratorA [arrowhead="none"]
    Decorator -> ConcreteDecoratorB [arrowhead="none"]
    Decorator -> Component [label="decorates" dir="back"]

    {rank=same; ConcreteDecoratorA ConcreteDecoratorB}
}


An illustration showing the decorator pattern in software design, using the metaphor of nesting Matryoshka dolls. The image should depict a series of Matryoshka dolls, each nested inside the other, with labels indicating their roles as decorators. The outermost doll should represent the fully decorated object, and the innermost doll should represent the base object. The style should be clear and educational, suitable for explaining the concept of the decorator pattern.

お願い臎したす