モチベーション(意欲を高めます)
どのように達成するために必要な(つまり、実行時)ダイナミックすることができ、「拡張オブジェクト機能」を作るには?回避しながら、「増加する拡張機能を、」サブクラスの拡張の問題が原因?そのように起因する「機能拡張および変更」の影響が最小限に抑え?
テント(意図)
オブジェクトに動的にいくつかの追加の責任を追加します。増加した機能のため、Decoratorパターンは、サブクラスよりも柔軟です。 - 「デザインパターン」のGoF
図構造(構造)
合成モード
装飾パターンにおける様々な役割がある:
(1)抽象コンポーネント文字(成分):追加の責任を受信する準備ができて調節する抽象インタフェース与えられます。
(2)特定の構成要素の役割(成分コンクリート):クラスの定義は、付加的な責任を受信します。
(3)、装飾的役割(デコレータ):オブジェクトのコンポーネント(成分)のインスタンスを保持し、そして抽象部材とインターフェースするための一貫性のあるインターフェース。
(4)具体的な装飾的役割(コンクリートデコレータ):コンポーネントオブジェクトの責任は、追加責任を添加します。
アプリケーション:
/// <要約> /// この抽象クラスは、コンポーネントタイプを入力すると等価である家の中で定義された抽象インタフェースであり、餃子、包装される、装飾されるべきである /// </要約> パブリック 抽象 クラスハウス { パブリック 抽象 ボイドリフォーム(); // 家の装飾方法-これはコンポーネントの動作方法の種類に対応 } /// <まとめ> /// 型型デコレータに相当するインターフェースの装飾を定義するこの抽象クラス、特定の機能が必要な場合、このタイプは、サブクラス化することができ /// </要約> パブリック 抽象 クラス DecorationStrategyを:ハウス// キービスは関係がある-、この関係を持っている、反射、クラスが飾らすることができます装飾され続ける { // このタイプの具体的な実施形態を高めるために、組み合わせて基準デコレータタイプは-い具現、この点、包含関係の重要な特徴の一つである 保護します_Houseハウス、 保護 DecorationStrategy(ハウスハウス)// コンストラクタ注入により、プラットフォームの初期化 { この ._house = ハウス; } パブリック オーバーライド ボイドリフォームは() // このメソッドは、操作方法のデコレータの種類に相当する { IF(本。 !_house = ヌル) { この._house.Renovation(); } } } /// <要約> /// PatrickLiuの家、私はConcreteComponentタイプと同等の家を、行うには私の要求を押します、これは私たちの具体的な餃子です詰め物、私は個人的にネギスタッフィングを好む /// </要約> 公共 密封された クラスMyHouse:ハウス { パブリック オーバーライド ボイドリフォーム() { Console.WriteLineを(「装飾PatrickLiu家」); } } /// <まとめ> /// セキュリティ機能を有する装置、監視およびアラーム機能はなく、提供されてもよいですConcreteDecoratorA型で /// </要約> パブリック 密閉 クラスDecorationStrategy:HouseSecurityDecorator { 公共 HouseSecurityDecorator(ハウスハウス):ベース(ハウス){} 公共 オーバーライド ボイドリフォーム() { ベース.Renovation(); Console.WriteLineを(" 増加した安全システム" ); } } /// <まとめ> /// 有する絶縁材料インタフェースは、ConcreteDecoratorBタイプに対応する、断熱機能を提供する /// </要約> 公共 封印 クラスKeepWarmDecorator:DecorationStrategy { 公共 KeepWarmDecorator(ハウスハウス):ベース(ハウス){} 公共 オーバーライド ボイドリフォーム() { 基本.Renovation(); Console.WriteLineを(" 増加絶縁機能" ); } } 公共 クラスプログラム { 静的な 無効メイン() { ハウスmyselfHouse = 新新 MyHouse(); // これが私たちの餃子は、家飾るする必要がある DecorationStrategy securityHouse = 新新HouseSecurityDecorator(myselfHouseを); securityHouse.Renovation(); // そこの家セキュリティシステムは、 // 私はセキュリティシステムの両方を暖めるために持っている場合は、ライン上に飾るために続けるん DecorationStrategy securityAndWarmHouse = 新新HouseSecurityDecorator(securityHouse); securityAndWarmHouse.Renovation(); } }
ハイライトは、装飾的なパターンを実現します:
- 継承されない技術の組み合わせを使用することによって、Decoratorパターンは、実行時に動的にオブジェクトを成長させるための機能を達成するために、所望のように複数の延長部が機能してもよいです。別々の継承の使用を避けることは「柔軟性に欠ける」と「マルチサブクラス波及効果」を与えるために
- 抽象デコレータモードのインターフェイスとしてComponentクラスの行為は、特定の動作を実現するためにすべきではありません。コンポーネントクラスは透明でなければならないためとデコレータクラス - 言い換えるコンポーネントクラスデコレータのクラスを知ることなく、デコレータクラスは、外部からのコンポーネントクラスの機能を拡張することです。
- デコレータクラスが継承関係は、コンポーネントに表示され、すなわち、デコレータクラスはComponentクラスがインターフェイスにインターフェイスを有する継承します。しかし、関連のパフォーマンスの組み合わせとして実装され、HAS-コンポーネント、すなわちデコレータターンは、別のコンポーネントクラスを使用します。私たちは、コンポーネントオブジェクトを「飾る」するために、1つ以上のデコレータオブジェクトを使用することができ、および装飾後のオブジェクトはまだコンポーネントオブジェクトです。
- 「装飾的」手段を - Decoratorパターンは、問題「多重継承由来マルチサブクラス」を解決しない、デコレータモードアプリケーションの要旨「は、複数の方向に主要クラスの拡張」を解決することです。
利点の装飾パターン:
- その実装から抽象インタフェースを切り離します。
- 抽象と独立性の拡張を実現することができますが、相互に影響を与えません。
- クライアントに対して透過的インプリメンテーションの詳細は、特定の実装の詳細を隠すために使用されます。
欠点の装飾パターン:
- これは、システムの複雑さを増します
ブリッジモードでは、次のような状況で使用する必要があります。
- システムは、2つのレベル間の静的ビルドのリンクを避けるために、役割の抽象と具象ロールメンバー間のより多くの柔軟性を追加する必要がある場合。
- クライアントの役割に影響を与える、またはクライアントの役割の変化をもたらすべきではない任意の変更を達成するための設計要件は完全に透過的です。
- 私たちは、複数のプラットフォーム用のグラフィックスおよびウィンドウシステムを横断する必要があります。
- クラスの変更は、2つの独立した次元を存在し、二次元を拡張する必要があります。
第四に、.NET装飾パターンを実装
ネットフレームワークでは、「装飾的なパターン」の明らかな使用のタイプがあり、このタイプのストリームです。ストリームタイプは、それが実際のコンポーネントである、System.IO名前空間内の抽象インタフェースです。FileStreamを、NetworkStream、MemoryStreamをエンティティクラスConcreteComponentです。ストリームインタフェースを継承している右、CryptoStream装飾品を、BufferedStream。
図:
ストリームは、FileStreamを、オブジェクト、BufferedStream装飾品を飾るためにある、コンポーネント、装飾品の定義に相当します。我々は、部分的に定義され、定義BufferedStreamを見てください。
公共の 密封された クラスBufferedStream:ストリーム { 民間 のconst int型 _DefaultBufferSize = 4096 ; プライベートストリーム_stream。 }