当前位置:   article > 正文

C#设计模式之9-装饰者模式_c#装饰者模式中的私有字段

c#装饰者模式中的私有字段

装饰者模式(Decorator Pattern)

 

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/405 访问。

装饰者模式属于结构型模式,装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。

装饰者模式通过创建一个包装对象(wrapper),也就是用装饰来包裹真实的对象。

角色:

1、抽象构件(Component

给出一个抽象接口,以规范准备接收附加责任的对象;

2、具体构件(Concrete Component)

定义一个将要接收附加责任的类;

3、抽象装饰(Decorator)

持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口;

4、具体装饰(Concrete Decorator)

负责给构件对象添加上附加的责任。

示例:

命名空间DecoratorPattern中包含汽车Car类、玛莎拉蒂Maserati类、法拉利Fabbrica类、酷汽车CoolCar类、汽车车贴Paster类和汽车遮阳挡Visor类。本示例通过使用装饰者模式为汽车进行一次简单的外观装饰。

namespace DecoratorPattern
  1. public abstract class Car {
  2. public string Name { get; set; }
  3. public abstract void StartUp();
  4. }

汽车基类Car,充当抽象构件。

  1. public class Fabbrica : Car {
  2. public Fabbrica() {
  3. Name = "Fabbrica";
  4. }
  5. public override void StartUp() {
  6. Console.WriteLine($"{Name} is starting!");
  7. }
  8. }

法拉利Fabbrica类,充当具体构件。

  1. public class Maserati : Car {
  2. public Maserati() {
  3. Name = "Maserati";
  4. }
  5. public override void StartUp() {
  6. Console.WriteLine($"{Name} is starting!");
  7. }
  8. }

玛莎拉蒂Maserati类,充当具体构件。

  1. public abstract class CoolCar : Car {
  2. protected Car _car = null;
  3. public CoolCar(Car car) {
  4. _car = car;
  5. }
  6. public override void StartUp() {
  7. Console.WriteLine($"{_car.Name} is starting!");
  8. }
  9. }

酷汽车CoolCar类,充当抽象装饰。

  1. public class Paster : CoolCar {
  2. public Paster(Car car) : base(car) {
  3. }
  4. public override void StartUp() {
  5. SetPaster();
  6. base.StartUp();
  7. }
  8. private void SetPaster() {
  9. Console.WriteLine($"Set paster to {_car.Name}!");
  10. }
  11. }

汽车车贴Paster类,通过继承CoolCar类,为对汽车进行装饰提供了可能。

  1. public class Visor : CoolCar {
  2. public Visor(Car car) : base(car) {
  3. }
  4. public override void StartUp() {
  5. SetVisor();
  6. base.StartUp();
  7. }
  8. private void SetVisor() {
  9. Console.WriteLine($"Set visor to {_car.Name}!");
  10. }
  11. }

汽车遮阳挡Visor 类,通过继承CoolCar类,为对汽车进行装饰提供了可能。

  1. public class Program {
  2. private const string LINE_SPLIT = "-------------------------";
  3. private static Car _car = null;
  4. private static CoolCar _coolCar = null;
  5. public static void Main(string[] args) {
  6. _car = new Maserati();
  7. _coolCar = new Visor(_car);
  8. _coolCar.StartUp();
  9. Console.WriteLine(LINE_SPLIT);
  10. _car = new Fabbrica();
  11. _coolCar = new Paster(_car);
  12. _coolCar.StartUp();
  13. Console.WriteLine(LINE_SPLIT);
  14. Console.ReadKey();
  15. }
  16. }

以上是调用方的代码,以下是这个案例的输出结果:

  1. Set visor to Maserati!
  2. Maserati is starting!
  3. -------------------------
  4. Set paster to Fabbrica!
  5. Fabbrica is starting!
  6. -------------------------

优点:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/405 访问。

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

缺点:

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

使用场景:

1、需要扩展一个类的功能,或给一个类添加附加职责;
2、需要动态的给一个对象添加功能,这些功能可以再动态的撤销;
3、需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实;
4、当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸式增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/487397
推荐阅读
相关标签
  

闽ICP备14008679号