.NET デコレーション モードの説明

高洛峰
リリース: 2016-12-20 13:16:22
オリジナル
1471 人が閲覧しました

デコレーション モードの定義:

デコレーション モードは、元のクラス ファイルを変更したり継承を使用したりすることなく、オブジェクトの機能を動的に拡張する機能です。ラッピングオブジェクト、つまり装飾を作成することで、実際のオブジェクトをラッピングします。

デコレータパターン構造図:

.NET デコレーション モードの説明

デコレータパターンの役割:

(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();
  }
}
ログイン後にコピー
(1) 抽象コンポーネント (Component) の役割: 追加の責任を受け取る準備ができているオブジェクトを標準化するための抽象インターフェイスを提供します。 >これが電話インターフェイスです

(2) 具体的なコンポーネントの役割: 追加の責任を受け取るクラスを定義します。 ApplePhone
(3)デコレーターの役割:コンポーネント(コンポーネント)オブジェクトのインスタンスを保持し、抽象コンポーネントインターフェイスと一致するインターフェイスを実装します。 > デコレータを参照します
(4) 具体的なデコレータの役割: コンポーネント オブジェクトに追加の責任を追加します。 & Gt; アクセサリーとステッカーの目的について説明します

:

1. デコレーター モードと継承の目的はオブジェクトの機能を拡張することですが、デコレーターは継承よりも柔軟性を提供できます。

2. さまざまな特定の装飾クラスと、これらの装飾クラスの配置と組み合わせを使用することで、デザイナーはさまざまな動作の多くの組み合わせを作成できます。

欠点:

1. この機能は継承よりも柔軟ですが、より複雑になることも意味します。

2. 装飾モードを使用すると、デザイン内に多数の小さなクラスが生成され、プログラムが非常に複雑になります。
3. デコレーションモードは、抽象コンポーネント(Component)型プログラミング用です。ただし、特定のコンポーネント用にプログラミングしている場合は、アプリケーション アーキテクチャとデコレータが適切かどうかを再考する必要があります。もちろん、コンポーネント インターフェイスを変更したり、新しいパブリック動作を追加したり、「半透明」デコレータ モードを実装したりすることもできます。実際のプロジェクトでは最善の選択をしてください。

以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート