.NET装饰模式讲解

Dec 20, 2016 pm 01:16 PM

装饰模式的定义:

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

装饰者模式结构图:

装饰模式

装饰者模式角色:

(1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
(2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。 
(3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
(4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

实现:

引用生活中的例子,我们买了一部新手机,慢慢的给这部手机添加新的装饰,比如说贴膜,添加挂件.....

1.首先抽象出手机类,作为装饰者模式中的抽象组件:

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

2.假如现在我们买了一部苹果手机,现在继承自抽象类,实现具体组件类:

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

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();
    }
  }
}
Copier après la connexion

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("现在苹果手机有贴膜了");
  }
}
Copier après la connexion
/// <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("现在苹果手机有漂亮的挂件了");
  }
}
Copier après la connexion

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();
  }
}
Copier après la connexion

(1)抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。       >这里就是Phone接口
(2)具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。                   >这里指的ApplePhone
(3)装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。>指的Decorator
(4)具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。                   >指的是Accessories和Sticker

优点:

1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点:

1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
3. 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les alternatives à Null en C Quelles sont les alternatives à Null en C Mar 03, 2025 pm 05:37 PM

Cet article explore les défis des déréférences du pointeur nul dans C. Il soutient que le problème n'est pas nul lui-même, mais son utilisation abusive. L'article détaille les meilleures pratiques pour prévenir les déréférences, y compris les contrôles de pré-déréférence, le pointeur initiali

Comment ajouter le compilateur C de niveau suivant Comment ajouter le compilateur C de niveau suivant Mar 03, 2025 pm 05:44 PM

Cet article explique comment créer de nouvelles caractères en C en C en utilisant la séquence \ n Escape dans printf et met des fonctions. Il détaille les fonctionnalités et fournit des exemples de code démontrant son utilisation pour les ruptures de ligne en sortie.

Quel compilateur de langue C est le meilleur? Quel compilateur de langue C est le meilleur? Mar 03, 2025 pm 05:39 PM

Cet article guide les débutants sur le choix d'un compilateur C. Il fait valoir que le CCG, en raison de sa facilité d'utilisation, de sa large disponibilité et de ses vastes ressources, est la meilleure pour les débutants. Cependant, il compare également GCC, Clang, MSVC et TCC, mettant en évidence leur différenciation

Null est-il toujours important dans la programmation moderne dans le langage C? Null est-il toujours important dans la programmation moderne dans le langage C? Mar 03, 2025 pm 05:35 PM

Cet article met l'accent sur l'importance continue de Null dans la programmation C moderne. Malgré les progrès, NULL reste crucial pour la gestion explicite du pointeur, empêchant les défauts de segmentation en marquant l'absence d'une adresse mémoire valide. Meilleur prac

Quelles sont les versions Web des compilateurs de langage C? Quelles sont les versions Web des compilateurs de langage C? Mar 03, 2025 pm 05:42 PM

Cet article passe en revue les compilateurs C en ligne pour les débutants, en se concentrant sur la facilité d'utilisation et les capacités de débogage. Onlinegdb et Rep.Il sont mis en évidence pour leurs interfaces conviviales et leurs outils de débogage utiles. Autres options comme Programiz et Compil

CLANGE COMMANDE COMMANDE C compilateur de langage C Résumé du site Web officiel CLANGE COMMANDE COMMANDE C compilateur de langage C Résumé du site Web officiel Mar 03, 2025 pm 05:41 PM

Cet article compare les plateformes de programmation C en ligne, mettant en évidence les différences de fonctionnalités telles que les outils de débogage, les fonctionnalités IDE, la conformité standard et les limites de mémoire / d'exécution. Il soutient que la "meilleure" plate-forme dépend des besoins des utilisateurs,

Méthode de copie du code par compilateur de langage C Méthode de copie du code par compilateur de langage C Mar 03, 2025 pm 05:43 PM

Cet article traite de la copie de code efficace dans les Cides. Il souligne que la copie est une fonction IDE, pas une fonctionnalité de compilateur, et détaille des stratégies pour une efficacité améliorée, y compris l'utilisation d'outils de sélection IDE, le pliage de code, la recherche / remplacer, Templa

Comment résoudre le problème de ne pas faire apparaître la fenêtre de sortie par le compilateur de langage C Comment résoudre le problème de ne pas faire apparaître la fenêtre de sortie par le compilateur de langage C Mar 03, 2025 pm 05:40 PM

Cet article dépanne les fenêtres de sortie manquantes dans la compilation du programme C. Il examine des causes telles que le non-exécution de l'exécutable, des erreurs de programme, des paramètres de compilateur incorrects, des processus de fond et une terminaison rapide du programme. Les solutions impliquent ch

See all articles