デコレーション モードの定義:
デコレーション モードは、元のクラス ファイルを変更したり継承を使用したりすることなく、オブジェクトの機能を動的に拡張する機能です。ラッピングオブジェクト、つまり装飾を作成することで、実際のオブジェクトをラッピングします。
デコレータパターン構造図:
デコレータパターンの役割:
(1) 抽象コンポーネント (Component) の役割: 追加の責任を受け取る準備ができているオブジェクトを標準化するための抽象インターフェイスを提供します。
(2) 具体的なコンポーネントの役割: 追加の責任を受け取るクラスを定義します。
(3) Decorator ロール: コンポーネント オブジェクトのインスタンスを保持し、抽象コンポーネント インターフェイスと一致するインターフェイスを実装します。
(4) コンクリート デコレーターの役割: コンポーネント オブジェクトに追加の責任を追加する責任があります。
実装:
生活の例を引用すると、新しい携帯電話を購入し、ステッカーやウィジェットなどの新しい装飾を徐々に電話に追加しました...
1. の抽象コンポーネントとしての最初の抽象携帯電話クラス。デコレーター パターン:
/// <summary> /// 手机抽象类,即抽象者模式中的抽象组件类 /// </summary> public abstract class Phone { /// <summary> /// 打印方法 /// </summary> public abstract void Print(); }
2. 今、Apple 携帯電話を購入し、抽象クラスから継承して特定のコンポーネント クラスを実装するとします:
/// <summary> /// 苹果手机,即装饰着模式中的具体组件类 /// </summary> public class ApplePhone:Phone { /// <summary> /// 重写基类的方法 /// </summary> public override void Print() { Console.WriteLine("我有一部苹果手机"); } }
3。ここで、これに新しい装飾を追加したいと思います。電話、まず装飾クラスを抽象化しましょう:
/// <summary> /// 装饰抽象类,让装饰完全取代抽象组件,所以必须继承Phone /// </summary> public abstract class Decorator:Phone { private Phone p ; //该装饰对象装饰到的Phone组件实体对象 public Decorator(Phone p) { this.p = p; } public override void Print() { if (this.p != null) { p.Print(); } } }
4. 特定の装飾オブジェクト、装飾抽象クラスを継承します: ここに特定のフィルム装飾とペンダント装飾があります:
/// <summary> /// 贴膜,具体装饰者 /// </summary> public class Sticker:Decorator { public Sticker(Phone p) : base(p) { } public override void Print() { base.Print(); //添加行为 AddSticker(); } /// <summary> /// 新的行为方法 /// </summary> public void AddSticker() { Console.WriteLine("现在苹果手机有贴膜了"); } }
/// <summary> /// 手机挂件,即具体装饰者 /// </summary> public class Accessories:Decorator { public Accessories(Phone p) : base(p) { } public override void Print() { base.Print(); // 添加新的行为 AddAccessories(); } /// <summary> /// 新的行为方法 /// </summary> public void AddAccessories() { Console.WriteLine("现在苹果手机有漂亮的挂件了"); } }
5.
/// <summary> /// 设计模式-装饰者模式 /// </summary> class Program { static void Main(string[] args) { Phone ap = new ApplePhone(); //新买了个苹果手机 Decorator aps = new Sticker(ap); //准备贴膜组件 aps.Print(); Decorator apa = new Accessories(ap); //过了几天新增了挂件组件 apa.Print(); Sticker s = new Sticker(ap); //准备贴膜组件 Accessories a = new Accessories(s);//同时准备挂件 a.Print(); } }
(2) 具体的なコンポーネントの役割: 追加の責任を受け取るクラスを定義します。 ApplePhone
(3)デコレーターの役割:コンポーネント(コンポーネント)オブジェクトのインスタンスを保持し、抽象コンポーネントインターフェイスと一致するインターフェイスを実装します。 > デコレータを参照します
(4) 具体的なデコレータの役割: コンポーネント オブジェクトに追加の責任を追加します。 & Gt; アクセサリーとステッカーの目的について説明します
2. さまざまな特定の装飾クラスと、これらの装飾クラスの配置と組み合わせを使用することで、デザイナーはさまざまな動作の多くの組み合わせを作成できます。
2. 装飾モードを使用すると、デザイン内に多数の小さなクラスが生成され、プログラムが非常に複雑になります。
3. デコレーションモードは、抽象コンポーネント(Component)型プログラミング用です。ただし、特定のコンポーネント用にプログラミングしている場合は、アプリケーション アーキテクチャとデコレータが適切かどうかを再考する必要があります。もちろん、コンポーネント インターフェイスを変更したり、新しいパブリック動作を追加したり、「半透明」デコレータ モードを実装したりすることもできます。実際のプロジェクトでは最善の選択をしてください。