デコレーター パターン定義: この効果は、派生クラスを通じてクラス属性を追加または変更するのではなく、パターン設計を通じて動的に実現され、継承よりも便利で柔軟であり、プログラムの複雑さが軽減されます。
たとえば
王峰はチャンピオンチームを構築します。
まず、チームカテゴリーは空です。王峰の継続的な努力の結果、彼はチームに生徒を獲得し、チームメンバーがパフォーマンスを発揮できる適切なプラットフォームを作成しました。
チームは常に強化され、より完成度が高まっています。さまざまなニーズに応じて基本クラスに追加や変更を加え、最終的に承認を得てニーズを満たすのはデコレータです。
アセンブラパターンを実装するためのクラス図:
チーム編成コード
//汪峰战队 abstract class WangFengTeam { //执行策划命令 abstract public void Acrion(); } //学员 class Student : WangFengTeam { // Methods override public void Acrion() { Console.WriteLine("汪峰团队学员情况:"); } } // 战队总策划 abstract class Direct : WangFengTeam { //汪峰战队 protected WangFengTeam team; // 策划活动 public void SetComponent(WangFengTeam team) { this.team = team; } //执行策划 override public void Acrion() { if (team != null) { team.Acrion(); } } } //男孩唱狂放型的,构建一个组合。 class BoyTeam : Direct { // 组合名称 public string teamName= "锋利的Jquery"; //具体策划 override public void Acrion() { base.Acrion(); Console.WriteLine("我是汪峰团队,狂放型的。"); } } //女孩唱婉约型的,来个模特表演 class GrilTeam : Direct { //具体策划 override public void Acrion() { base.Acrion(); Console.WriteLine("我是汪峰团队,婉约型的。"); //模特表演 show(); } public void show() { Console.WriteLine("婉约型,走秀"); } }
クライアントコード:
public static void Main() { Student team = new Student(); BoyTeam boy = new BoyTeam(); GrilTeam girl = new GrilTeam(); //团队男孩装饰 boy.SetComponent(team); //团队女孩装饰 girl.SetComponent(boy); girl.Acrion(); Console.Read(); }
デコレータパターンの長所と短所
デコレータパターンの詳細な紹介を読んだ後、分析を続けてみましょう長所と短所。
利点:
装飾パターンと継承の目的はオブジェクトの機能を拡張することですが、デコレーターパターンは継承よりも柔軟です
さまざまな特定の装飾クラスとこれらのクラスの配置と組み合わせを使用することにより、デザイナーは、さまざまな動作の組み合わせを作成できます
デコレーター パターンは非常に拡張性があります
欠点:
デコレーター パターンを使用しすぎると、デザイン内に多数の小さなオブジェクトが生成され、プログラムがより複雑になります。また、オブジェクトが増えると、特にすべてが似ている場合には間違いが起こりにくくなります。
使用シナリオ
デコレーター パターンが使用される具体的な状況を見てみましょう。 デコレーター パターンは、次の状況で使用する必要があります。
クラスの機能を拡張するか、クラスに追加の責任を追加する必要がある。
オブジェクトに関数を動的に追加する必要があり、これらの関数は動的に取り消すことができます。
いくつかの基本的な関数の順列と組み合わせによって生成される非常に多くの関数を追加する必要があります
.NET でのデコレータ パターンの実装
.NET クラス ライブラリにはデコレータ パターンの実装もあります。 class は System.IO.Stream です。Stream クラスの構造を見てみましょう:
BufferedStream、CryptoStream、および GZipStream は、実際には 2 つの特定の装飾クラスです。ここでのデコレータ モードでは、抽象的な装飾の役割 (Decorator) が省略されています。以下は、クライアントが MemoryStream に関数を動的に追加する方法を示しています。
MemoryStream memoryStream = new MemoryStream(new byte[] {95,96,97,98,99}); // 扩展缓冲的功能 BufferedStream buffStream = new BufferedStream(memoryStream); // 添加加密的功能 CryptoStream cryptoStream = new CryptoStream(memoryStream,new AesManaged().CreateEncryptor(),CryptoStreamMode.Write); // 添加压缩功能 GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, true);
概要
これでデコレータ パターンの紹介は終わりです。デコレータ パターンは、継承ではなくオブジェクトの組み合わせを使用して、実行時にオブジェクト関数を動的に拡張する機能を実現し、必要に応じて複数のオブジェクト関数を拡張できます。継承のみを使用することによって生じる「柔軟性の低さ」と「複数のサブクラスの派生問題」を回避します。同時に、これは「継承よりもオブジェクトの構成を優先する」というオブジェクト指向の設計原則と「オープン-クローズド」原則ともよく一致しています。
C# デザイン パターン プログラミングにおけるデコレーター パターンの分析に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。