ToB企服应用市场:ToB评测及商务社交产业平台

标题: C# 计划模式(布局型模式):装饰器模式 [打印本页]

作者: 梦应逍遥    时间: 2025-1-4 10:34
标题: C# 计划模式(布局型模式):装饰器模式
C# 计划模式(布局型模式):装饰器模式

在软件开辟中,面对必要扩展功能但又不想修改已有代码的情况时,装饰模式(Decorator Pattern)是一个非常有效的计划模式。装饰模式允许我们在不改变对象自身的情况下,动态地为其添加新的功能。它通过创建一个装饰器类来包裹原始对象,从而增强对象的行为。
1. 装饰模式的界说

装饰模式是一种布局型计划模式,主要用于在不改变对象布局的前提下,动态地为对象添加额外的职责。装饰模式通过创建一个包装类来“装饰”目的对象,并且该包装类可以或许增强或修改目的对象的行为。
2. 装饰模式的布局

装饰模式通常包括以下几个部分:

3. 装饰模式的应用场景

装饰模式适用于以下几种场景:

4. C# 实现装饰模式

假设我们有一个简单的饮料类,表现不同类型的饮料。我们希望可以或许动态地为饮料添加额外的配料(如牛奶、糖等),而不修改原始饮料的代码。我们可以使用装饰模式来实现这一功能。
  1. using System;
  2. // 组件接口
  3. public interface IDrink
  4. {
  5.     string GetDescription();
  6.     double Cost();
  7. }
  8. // 具体组件:咖啡
  9. public class Coffee : IDrink
  10. {
  11.     public string GetDescription()
  12.     {
  13.         return "Coffee";
  14.     }
  15.     public double Cost()
  16.     {
  17.         return 2.0;
  18.     }
  19. }
  20. // 具体组件:茶
  21. public class Tea : IDrink
  22. {
  23.     public string GetDescription()
  24.     {
  25.         return "Tea";
  26.     }
  27.     public double Cost()
  28.     {
  29.         return 1.5;
  30.     }
  31. }
  32. // 装饰器类
  33. public abstract class DrinkDecorator : IDrink
  34. {
  35.     protected IDrink _drink;
  36.     public DrinkDecorator(IDrink drink)
  37.     {
  38.         _drink = drink;
  39.     }
  40.     public virtual string GetDescription()
  41.     {
  42.         return _drink.GetDescription();
  43.     }
  44.     public virtual double Cost()
  45.     {
  46.         return _drink.Cost();
  47.     }
  48. }
  49. // 具体装饰器:添加牛奶
  50. public class MilkDecorator : DrinkDecorator
  51. {
  52.     public MilkDecorator(IDrink drink) : base(drink) { }
  53.     public override string GetDescription()
  54.     {
  55.         return _drink.GetDescription() + " + Milk";
  56.     }
  57.     public override double Cost()
  58.     {
  59.         return _drink.Cost() + 0.5;
  60.     }
  61. }
  62. // 具体装饰器:添加糖
  63. public class SugarDecorator : DrinkDecorator
  64. {
  65.     public SugarDecorator(IDrink drink) : base(drink) { }
  66.     public override string GetDescription()
  67.     {
  68.         return _drink.GetDescription() + " + Sugar";
  69.     }
  70.     public override double Cost()
  71.     {
  72.         return _drink.Cost() + 0.2;
  73.     }
  74. }
  75. // 客户端代码
  76. class Program
  77. {
  78.     static void Main(string[] args)
  79.     {
  80.         // 创建一杯咖啡
  81.         IDrink drink = new Coffee();
  82.         Console.WriteLine($"{drink.GetDescription()} costs {drink.Cost()}");
  83.         // 给咖啡添加牛奶
  84.         drink = new MilkDecorator(drink);
  85.         Console.WriteLine($"{drink.GetDescription()} costs {drink.Cost()}");
  86.         // 给咖啡添加糖
  87.         drink = new SugarDecorator(drink);
  88.         Console.WriteLine($"{drink.GetDescription()} costs {drink.Cost()}");
  89.         // 创建一杯茶
  90.         IDrink tea = new Tea();
  91.         tea = new MilkDecorator(tea);  // 给茶添加牛奶
  92.         Console.WriteLine($"{tea.GetDescription()} costs {tea.Cost()}");
  93.     }
  94. }
复制代码
在这个例子中:

通过装饰模式,我们可以动态地为饮料对象添加不同的配料,且不必要修改原有的 Coffee 或 Tea 类。每次增强功能时,我们只必要创建一个新的装饰器类,并将其包装在原始对象上。
5. 装饰模式的优缺点

长处

缺点

6. 总结

装饰模式是一个非常机动的计划模式,适用于必要在运行时为对象动态添加功能的场景。它通过装饰器类来增强目的对象的行为,并允许我们不修改原始对象的代码就能实现功能扩展。掌握装饰模式,可以帮助我们计划出更加机动、可扩展的系统,尤其适用于那些具有很多扩展功能的对象。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4