• 设计模式:装饰者模式


    装饰者模式

    简介

    单例模式,是一种一种结构型模式,它动态地给一个对象添加额外的职责,采用对象组合而非继承的方式实现了再运行时动态地扩展对象功能的能力。

    背景

    在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机贴膜,添加挂件等,如果此时利用继承来实现的话,就需要定义无数的类,如贴膜手机类StickerPhone、手机挂件类AccessoriesPhone等,这样就会导致 ”子类爆炸“问题,为了解决这个问题,装饰者模式出现了。

    主要角色

    • 抽象构件(Phone)角色:给出一个抽象接口,以规范准备接受附加责任的对象。
    • 具体构件(ApplePhone)角色:定义一个将要接收附加责任的类。
    • 装饰(Decorate)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
    • 具体装饰(Sticker和Accessories)角色:负责给构件对象"装饰"附加的责任。

    实现

    public abstract class Phone
    {
         public abstract void Show();
    }
    public class ApplePhone : Phone
    {
         public override void Show()
         {
              Console.WriteLine("我是iphone手机");
         }
    }
    /// <summary>
    /// 手机装饰抽象类
    /// </summary>
    public abstract class Decorate : Phone
    {
         Phone phone = null;
         public void SetDecorate(Phone phone)
         {
              this.phone = phone;
         }
         public override void Show()
         {
              if (this.phone != null)
              {
                   this.phone.Show();
              }
         }
    }
    /// <summary>
    /// 配件装饰
    /// </summary>
    public class Accessories : Decorate
    {
         public override void Show()
         {
              base.Show();
              //增加一些业务逻辑
              Console.WriteLine("对手机进行了配件装饰");
         }
    }
    /// <summary>
    /// 贴膜装饰
    /// </summary>
    public class Sticker : Decorate
    {
         public override void Show()
         {
              base.Show();
              //增加一些业务逻辑 
              Console.WriteLine("对手机进行了贴膜装饰");
         }
    }
    /// <summary>
    /// 装饰着模式调用
    /// </summary>
    class Program
    {
         static void Main(string[] args)
         {
              Phone phone = new ApplePhone();
              Decorate sticker = new Sticker();
              Decorate accessories = new Accessories();
              //将贴膜装到手机上。。。
              sticker.SetDecorate(phone);
              //将配件装到贴膜手机上。。。
              accessories.SetDecorate(sticker);
              //最后将完整的手机Show一下。。。
              accessories.Show();
              //输出:
              //我是iphone手机
              //对手机进行了贴膜装饰
              //对手机进行了配件装饰
         }
    }
    

    综述

    优点:

    • 装饰这模式和继承的目的都是扩展对象的功能,但装饰者模式比继承更灵活
    • 通过使用不同的具体装饰类以及这些类的排列组合,设计师可以创造出很多不同行为的组合
    • 装饰者模式有很好地可扩展性

    缺点:

    • 装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变的更复杂。并且更多的对象会是的差错变得困难,特别是这些对象看上去都很像。

    补充

    装饰器模式,从某种角度上说,可能更适合用于对已经成型的业务进行修改的场景,不管是用于动态扩展,还是动态移除,装饰器都能很方便的胜任对对象的修改操作。另外就是,继承也可以解决类似问题,但是装饰器可以更好的扩展,因为,我们一般解决的是特定对象的特定行为,而不会对整个对象进行修改,这样子跟大型重构没有什么区别。所以,特定场景的修改,装饰器来的更快,更简单,更有效率,没有必要兴师动众。

    下载源码

    人生苦短,我写博客
  • 相关阅读:
    JS写游戏
    为运算表达式设计优先级
    原子的数量
    二叉搜索树的范围和
    所有可能的满二叉树
    有效的井字游戏
    站在对象模型的尖端
    执行期语意学
    构造、析构、拷贝语意学
    [CSP-S模拟测试]:序列(二分答案+树状数组)
  • 原文地址:https://www.cnblogs.com/RenshuozZ/p/11146469.html
Copyright © 2020-2023  润新知