Heim >Backend-Entwicklung >C#.Net-Tutorial >Erläuterung des .NET-Dekorationsmodus

Erläuterung des .NET-Dekorationsmodus

高洛峰
高洛峰Original
2016-12-20 13:16:221493Durchsuche

Definition des Dekorationsmodus:

Der Dekorationsmodus ist die Funktion, ein Objekt dynamisch zu erweitern, ohne die ursprüngliche Klassendatei zu ändern und Vererbung zu verwenden. Es umhüllt das reale Objekt, indem es ein Verpackungsobjekt, also eine Dekoration, erstellt.

Strukturdiagramm des Dekoratormusters:

Erläuterung des .NET-Dekorationsmodus

Rolle des Dekoratormusters:

(1) Rolle der abstrakten Komponente (Komponente): gegeben Eine abstrakte Schnittstelle die Objekte spezifiziert, die bereit sind, zusätzliche Verantwortlichkeiten zu übernehmen.
(2) Rolle der konkreten Komponente: Definieren Sie eine Klasse, die zusätzliche Verantwortlichkeiten erhält.
(3) Dekorateurrolle: Enthält eine Instanz eines Komponentenobjekts und implementiert eine Schnittstelle, die mit der abstrakten Komponentenschnittstelle konsistent ist.
(4) Rolle des Betondekorateurs: Verantwortlich für das Hinzufügen zusätzlicher Verantwortlichkeiten zu Komponentenobjekten.

Umsetzung:

Anhand von Beispielen aus dem Leben kauften wir ein neues Mobiltelefon und fügten dem Telefon nach und nach neue Dekorationen wie Folien und Anhänger hinzu.... .

1. Abstrahieren Sie zunächst die Mobiltelefonklasse als abstrakte Komponente im Dekoratormuster:

/// <summary>
/// 手机抽象类,即抽象者模式中的抽象组件类
/// </summary>
public abstract class Phone
{
  /// <summary>
  /// 打印方法
  /// </summary>
  public abstract void Print();
}

2. Wenn wir jetzt ein Apple-Mobiltelefon gekauft haben, und jetzt erbt es von der abstrakten Klasse und implementiert die spezifische Komponentenklasse:

/// <summary>
/// 苹果手机,即装饰着模式中的具体组件类
/// </summary>
public class ApplePhone:Phone
{
  /// <summary>
  /// 重写基类的方法
  /// </summary>
  public override void Print()
  {
    Console.WriteLine("我有一部苹果手机");
  }
}

3. Jetzt möchte ich diesem Telefon zur Dekoration neue Komponenten hinzufügen , abstrahieren wir zunächst die Dekorationsklasse:

/// <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. Das spezifische Dekorationsobjekt erbt die abstrakte Dekorationsklasse: Hier sind die spezifische Filmdekoration und die Anhängerdekoration :

/// <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. Aufruf:

/// <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) Abstrakte Komponentenrolle: Geben Sie eine abstrakte Schnittstelle an die Objekte spezifiziert, die bereit sind, zusätzliche Verantwortlichkeiten zu übernehmen.​​​​ >Hier ist die Telefonschnittstelle
(2) Rolle der konkreten Komponente: Definieren Sie eine Klasse, die zusätzliche Verantwortlichkeiten erhält. Applephone
(3) Dekorateur -Rolle: Hält eine Instanz eines Komponentenobjekts (Komponenten) und implementiert eine Schnittstelle, die mit der Schnittstelle zur abstrakten Komponenten übereinstimmt. >Bezieht sich auf Dekorateur
(4) Rolle des Betondekorateurs: Verantwortlich für das Hinzufügen zusätzlicher Verantwortlichkeiten zu Komponentenobjekten. >Bezieht sich auf Zubehör und Aufkleber

Vorteile:

1. Der Zweck des Decorator-Musters und der Vererbungsbeziehung besteht darin, die Funktionalität von Objekten zu erweitern, aber Decorator kann mehr Flexibilität bieten als die Vererbung.
2. Durch die Verwendung verschiedener spezifischer Dekorationsklassen und die Anordnung und Kombination dieser Dekorationsklassen können Designer viele Kombinationen unterschiedlicher Verhaltensweisen erstellen.

Nachteile:

1. Diese Funktion ist flexibler als die Vererbung und bedeutet auch mehr Komplexität.
2. Der Dekorationsmodus führt zu vielen kleinen Klassen im Design. Bei übermäßiger Nutzung wird das Programm sehr kompliziert.
3. Der Dekorationsmodus ist für die Programmierung abstrakter Komponenten (Komponenten) vorgesehen. Wenn Sie jedoch für bestimmte Komponenten programmieren, sollten Sie Ihre Anwendungsarchitektur überdenken und prüfen, ob Dekoratoren geeignet sind. Natürlich können Sie auch die Komponentenschnittstelle ändern, neue öffentliche Verhaltensweisen hinzufügen und den „transluzenten“ Dekoratormodus implementieren. Treffen Sie bei tatsächlichen Projekten die beste Wahl.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:.NET-Adaptermuster erklärtNächster Artikel:.NET-Adaptermuster erklärt