设计模式之装饰者模式(五)

设计模式之装饰者模式(五)

  前几天把创建型设计模式学习了一下,因为之前了解过,算是复习吧.

  接下来进行结构型设计模式,结构型设计模式包括:适配器,桥接,外观,组合,装饰者,享元,代理

  今天来学习装饰者模式,因为之前有了解过装饰者和代理模式,下面正式开始.还是老步骤,概念,介绍,图解,代码展示;

  一  概念

  装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

  这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

  二  介绍 

意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

如何解决:将具体功能职责划分,同时继承装饰者模式。

应用实例: 1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。 

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

注意事项:可代替继承。

  三  图解

  从图中我们可以看出,装饰器和被装饰的组件类有一个父类,而装饰器可以写成一个抽象类,然后可以进行不同的装饰实现

  四  代码展示

  突然发现前面几篇文章在代码展示的时候对举得例子没有做详细介绍

  接下来会对写的代码做一个介绍,来理清楚类之间的关系,帮助大家有一个更好的理解,先展示代码,再来解释吧;

/// <summary>
    /// 主程序
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Decorator de = new DecoratorThree(new DecoratorTwo(new DecoratorOne(new ConcreteComponent())))  ;
            de.Operation();
            Console.ReadLine();
        }
    }
================================
  /// <summary>
    /// 被装饰组件和装饰器共同的抽象父类
    /// </summary>
    public abstract class Component
    {
        public abstract void Operation();
    }
================================
 /// <summary>
    /// 真正要被装饰的组件
    /// </summary>
    public class ConcreteComponent : Component
    {
        public override void Operation()
        {
            Console.WriteLine("我就是个单纯的对象,,,假如我是一个毛坯房吧");
        }
    }
================================
 /// <summary>
    /// 抽象的装饰器
    /// </summary>
    public abstract class Decorator : Component
    {
        public Decorator(Component ic)
        {
            component = ic;
        }
        public Component component;
        public override void Operation()
        {
            component.Operation();
        }
    }
================================
 /// <summary>
    /// 装饰器一
    /// </summary>
    public class DecoratorOne:Decorator
    {
        public DecoratorOne(Component ic):base(ic) {
          
        }
        public override void Operation()
        {
            base.Operation();
            Console.WriteLine("装饰第一步。。。先来贴地板吧,选一个高档的木地板来装饰一下");
        }
    }
================================
 /// <summary>
    /// 装饰器二
    /// </summary>
    public class DecoratorTwo : Decorator
    {
        public DecoratorTwo(Component ic) : base(ic)
        {
        }
        public override void Operation()
        {
            base.Operation();
            Console.WriteLine("装饰第二步。。。我是一个粉刷匠,我刷,我刷,我刷刷刷,好了,刷好大白了");
        }
    }
================================
 /// <summary>
    /// 装饰器三
    /// </summary>
    public class DecoratorThree : Decorator
    {
        public DecoratorThree(Component ic) : base(ic)
        {
        }
        public override void Operation()
        {
            base.Operation();
            Console.WriteLine("装饰第三步。。。接下来我来给新房子置办一下家具,买沙发,买电视,冰箱,就是买买买......");
        }
    }
View Code

  见很多人都用游戏来举例,由于本人不喜欢玩游戏,就举一个装修房子的例子吧,代码量很少,已经都展示出来,不妨可以试一试

  按照上边的图来创建类,我实现了三个具体的装饰器,这里要说明一下重点,,在装饰器中添加了一个真正要被装饰的一个引用.来达到要装饰组件的目地;

  接下来看一下运行结果

  

  这样我们就把一个毛坯房装修成了一个有地板,白墙,有家具的温馨的小房子了;

  当然装饰的顺序不重要,我们也可以先买家具再去刷墙和铺地板

  当然运行完之后可以看一下运行的过程,感觉很巧妙,思想确实很重要

  装饰者模式就写到这吧...代码实现不难,重要的是要记清楚图,理解思想

欢迎指正,共同学习,共同进步......

原文地址:https://www.cnblogs.com/zkhbalance/p/9129279.html