回します。http://www.jellythink.com/archives/171#prettyPhoto
装飾的なパターンとは何ですか?
GOFの中でオブジェクトを動的にいくつかの追加の責任を追加する:「デザインパターン:オブジェクト指向における再利用のための、」装飾的なパターンの本は、これは言っていました。増加は、機能的に、Decoratorパターンは、より柔軟なサブクラス比べ。
装飾的なパターンは、動的にオブジェクトに機能を追加することができ、それは外部のオブジェクトからオブジェクトに機能を追加することです。関数は、一般に、オブジェクトは、対応する関数を変更直接添加されるか、または拡張に対応するサブクラスに由来する、またはオブジェクト合成方法であり、オブジェクトに追加されます。明らかに、直接このように対応するクラスを変更することは望ましくありません。オブジェクト指向設計では、我々は、オブジェクトの継承が機能を拡張し、多重化するために、オブジェクトの組み合わせを使用しないようにしてください。デコレータは、オブジェクトベースのアプローチの組み合わせである、オブジェクトは、必要な機能を追加することは非常に柔軟であることができます。自然Decoratorパターンは、動的な組み合わせです。動的な手段である、組み合わせが目標です。要するに、装飾的なパターンは、動作中に、複素関数、分散によって必要とされるダイナミック組成などのパターンを簡略化されます。それは私たちではなく、クラス全体のオブジェクトにいくつかの機能を追加することができます。
成分:オブジェクト・インタフェース定義は、これらの役割は、動的オブジェクトに追加することができます。
ConcreteComponent:Componentから継承された特定のコンポーネントの定義は、コンポーネントのクラスの仮想関数をオーバーライドします。
デコレータ:コンポーネントオブジェクトポイントが必要にポインタが装飾対象物へのポインタを維持するため、およびコンポーネントインタフェースと一致するインタフェースを定義します。
ConcreteDecorator:コンポーネントに機能を追加します。
/ * **ファイル名:DecoratorPatternDemo **著者:ジェリー・ヤング **日:2013年12月19日 **説明:詳細について、をご覧くださいhttp://www.jellythink.com * / 書式#include <iostreamの> 使用して 名前空間をSTD; クラスコンポーネント { パブリック: 仮想 ボイド動作()は= 0 。 }。 クラス ConcreteComponent:公共コンポーネント { パブリック: 無効操作() { coutの << "私はdecoratored ConcreteComponent午前" << ;てendl } }; クラスのデコレータ:公共コンポーネント { パブリック: デコレーター(コンポーネント * pComponent):m_pComponentObj(pComponent){} 無効操作() { 場合(!m_pComponentObj = NULL) { m_pComponentObj - > 操作(); } } 保護: 成分 * m_pComponentObj; }; クラス ConcreteDecoratorA。公共デコレータ { パブリック: ConcreteDecoratorA(成分 * pDecorator):デコレータ(pDecorator){} ボイド動作() { AddedBehavior()。 デコレーター::オペレーション(); } ボイド AddedBehavior() { COUT << " この追加された挙動A. " << ENDL。 } }。 クラス ConcreteDecoratorB:公共デコレータ { パブリック: ConcreteDecoratorB(コンポーネント *pDecorator):デコレータ(pDecorator){} ボイド動作() { AddedBehavior()。 デコレーター::オペレーション(); } ボイド AddedBehavior() { COUT << " この追加された挙動B. " << ENDL。 } }。 INT メイン() { コンポーネント * pComponentObj = 新しいConcreteComponent()。 デコレーター * pDecoratorAOjb = 新しいConcreteDecoratorA(pComponentObj)。 pDecoratorAOjb - > オペレーション(); COUT<< " ============================================= " < < てendl; デコレーター * pDecoratorBOjb = 新しいConcreteDecoratorB(pComponentObj)。 pDecoratorBOjb - > オペレーション(); 裁判所未満 << " ============================================= " << てendl; デコレーター * pDecoratorBAOjb = 新しいConcreteDecoratorB(pDecoratorAOjb)。 pDecoratorBAOjb - > オペレーション(); 裁判所未満 << " ============================================= " <<削除pDecoratorBAOjbを。 pDecoratorBAOjb = NULL; 削除pDecoratorBOjbを。 pDecoratorBOjb = NULL; 削除pDecoratorAOjbを。 pDecoratorAOjb = NULL; 削除pComponentObjを。 pComponentObj = NULL; }
機会を利用して
- 他のオブジェクトに影響を与えずに、個々のオブジェクトに機能を追加するための動的な、透明な方法。
- ハンドルこれらの責任を取り消すことができます。
- サブクラス拡張することを生成する際の方法を用いることができません。あるケースでは、サブカテゴリーの多数を生成するそれぞれの組み合わせをサポートするために別々の拡張の多数存在することができるように、サブクラスの数は爆発的な成長。クラス定義のクラスまたはサブクラスの定義を生成するために使用することができないので、別の状況は隠すことができます。
注意事項
- ユーザーのために、統一されたインターフェイスであるので、インターフェースの一貫性、それはコンポーネントのインタフェース装飾品を飾らなければならないとのインターフェースはとてもConcreteDecoratorクラスのすべてが共通の親を持つ必要があり、同じです。
- デコレータ抽象クラスが省略され、機能を追加する必要が、それは抽象クラスを定義する必要がデコレータない場合にのみ。私たちは、多くの場合、むしろ新しいシステムを設計するよりも、既存のクラス階層を対処する必要があるので、あなたは任務がでConcreteDecoratorに統合コンポーネントデコレータに要求を前方に置くことができます。
- Componentクラスのためにそれをシンプルに保つため、Componentクラスが定義されたインタフェースに焦点を当てるべきであるように、一般的なコンポーネントのクラスを持っている必要があります一貫性、部品や装飾インタフェースを確保するために、そのコンポーネントのクラスのシンプルさを維持することは、非常に重要です代わりに、データを格納します。データ表現の定義は、そうでない場合はComponentクラスが頻繁に使用することが困難になる、あまりにも複雑で面倒になる、子クラスまで遅延されなければなりません。コンポーネントクラスは、あまりにも多くの機能を付与するだけでなく、彼らは大幅に増加する必要はありません。その機能のいくつかの具体的なサブクラスを作ります。
達成のポイント
- Decoratorパターンの中Componentクラス抽象インタフェースとして働くには、特定の動作を実現するためにすべきではありません。デコレータとコンポーネントクラスはComponentクラスクラスデコレータを知らなくても、他の言葉で、型に透明でなければならない、デコレータクラスは、外部からコンポーネントクラスの機能を拡張することです。
- デコレータクラスインターフェース継承のパフォーマンスには「 - 」コンポーネント、すなわちデコレータクラスは、コンポーネントクラスがインターフェイスを有する継承します。しかし、組み合わせの性能と関係の実現に「持っている- 」のコンポーネント、すなわち、デコレーターのターンは、別のコンポーネントクラスを使用しています。私たちは、コンポーネントオブジェクトを「飾る」するために、1つ以上のデコレータオブジェクトを使用することができ、および装飾後のオブジェクトはまだコンポーネントオブジェクトです。
- Decortorモードが問題「多重継承を派生マルチサブクラスを」解決されていない、アプリケーションノートDecoratorパターン「は、複数の方向に主要クラスの拡張」を解決することである - 「装飾」を意味するため。
- 実際にはDecoratorパターンを使用することは非常に柔軟であることができます。一つだけConcreteComponentクラス抽象コンポーネントクラスのない場合は、デコレータークラスがConcreteComponentのサブクラスです。一つだけConcreteDecoratorクラスならば、そこに別のデコレータークラスの必要がなく、クラスとしてデコレータとConcreteDecorator責任をマージすることができます。
- Decoratorパターンの利点は、特に、異なる組み合わせおよびこれらの装飾装飾の順列を用いて異なる挙動の組み合わせの多くを作成することができ、連続拡張よりも柔軟性を提供することにあります。
- 装飾的なパターンを使用するには、継承はクラスの数より少ない必要が使用することができます。設計が容易であることはもちろん、少数のクラスを使用します。しかし、一方で、装飾的なパターンの使用は、オブジェクトの継承以上を生産します。特に、これらのオブジェクト内のトラブルシューティングをより困難にするオブジェクトは、非常に似ています。
ブリッジモードとの違い
前にまとめC ++の設計パターン-ブリッジモードを、あなたは両方が洪水のサブクラスの場合、その結果、過度のを防止するために継承されていることがわかります。だから、2つの主な違いは、それ何ですか?両方が独立して変化させることができるように、ブリッジモードでは、抽象的(ではない継承モードと組み合わせて)分離の実装に定義されています。あなたは、派生クラスの成長を減らすことができます。このような観点からの光、およびデコレータは、同様の場合は、どちらもまだいくつかの重要な違いがあります。
- ブリッジモードでは、分離を、前記実際に属性または属性及び行動分離に基づいた分離構造(構造及び実装が変化してもよい場合)を意味する;単に独立実施閉じデコレータ属性がベースクラス、拡張されたその装飾を達成するように。たとえば:あなたは橋の完成を達成するためのクラスと例外処理モデル間の例外クラスを使用できますが、装飾的なパターンを設計するために使用することはできません。例外処理のために拡張する必要がある場合、我々は、追加するために例外処理クラスのデコレータを追加することができますブリッジモードと装飾的なパターンのミックスで例外処理を、拡大する装飾工程;
- 横架行動は行動が、ここでの行動との間に相関がないことに注意して、お互いの行動に関連付けられていないが、それは同じ関連付けられた例外と例外処理動作がない、と言う、の間であり、行動Decoratorパターン持ちますその結果現れるのスタック全体、様々なアクターの組み合わせの結果です。
概要
装飾に重点を置いて装飾的なパターン、コア機能に装飾効果、機能のクラスの組み合わせに拡張継承サブクラスは、ユーザーが拡大する必要がありますので、サブクラスは組み合わせの呼び出し、ユーザーにどのように利用者の組み合わせを渡します決断。私は装飾的なパターンを勉強するとき、それは我々はすべて知っているように、コア機能が大きな役割を果たしているように、コア子会社の機能にいくつかの装飾的な機能を追加することですが、最終的には、コア機能があるのです、単語の「装飾」の分析の焦点でありますそれが失われることはできません。私たちはWindowsシェルの開発をしたとき、我々は我々が必要とする装飾機能のいくつかを有効にするには、シェルのこの層の窓に装飾機能しているようなものだが、最終的な機能は、Windowsがシェル完成させることです。これは、当社のコア機能は、装飾与えるコートの層を追加し、それがより美しく、完璧に見えるようにすることで、同様です。
ます。https://www.cnblogs.com/diegodu/p/4448093.htmlで再現