设计模式之装饰模式(Decorator)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之装饰模式(Decorator)相关的知识,希望对你有一定的参考价值。

装饰模式是指对象在运行的过程中不断的增加对象,不断的增加功能,而不改变原来对象,只是将对象进行多一层的封装,这个原来类留有接口与

这个新的类进行连接,下面我们来假设有一个基类来做继承的角色类,这里大家都会想到使用抽象类来给子类提供方法,然后通过继承来实现

技术分享图片

然后初始化定义他有五件装备

 1 namespace 装饰模式
 2 {
 3     /// <summary>
 4     /// 裸装法师
 5     /// </summary>
 6     public class Mage : BaseCharacter
 7     {
 8         public override void Show()
 9         {
10             Console.WriteLine("我是裸装猩红女巫,下面开始我打装备的过程....");
11         }
12     }
13 
14     /// <summary>
15     ///  戴头盔的法师
16     /// </summary>
17     public class MageWithHelmet : BaseCharacter
18     {
19         public override void Show()
20         {
21             Console.WriteLine("我是猩红女巫,下面开始我打装备的过程....");
22             Console.WriteLine("我获得了一个海盗船长的头盔....");
23         }
24 
25     }
26 
27     /// <summary>
28     /// 戴肩甲的法师
29     /// </summary>
30     public class MageWithShoulder : BaseCharacter
31     {
32         public override void Show()
33         {
34             Console.WriteLine("我是猩红女巫,下面开始我打装备的过程....");
35             Console.WriteLine("我获得了一个肩甲....");
36         }
37     }
38 }

通过继承的方式,来完成给原来的类添加新功能,这里如果我们假设,在这五个功能里,我不仅只能添加一个功能,也可以组合添加几个功能

例如我一次性要添加头盔和肩膀,这时我们就继续的创建子类,假设我们只有5个装备类,我们的装备方案有多种组合,就可以演变出2的5次方,32个子类。如果手动去写,那将是庞大的工作

这时候我们的装饰模式就可以不用写那么多子类就解决这个问题。

实现思路就是先创建一个装饰基类,然后再建立一个头盔装饰类,将第一个基类进行一层封装,在调用时先调用父类的接口,再调自己接口,这样做的前题是所有装饰类都要继承同一个基类下面,下面上代码,这是第一层

 1    /// <summary>
 2     /// 装饰基类
 3     /// </summary>
 4     public class BaseDecorator:BaseCharacter
 5     {
 6         private BaseCharacter _BaseCharacter = null;
 7 
 8         public BaseDecorator(BaseCharacter character)
 9         {
10             this._BaseCharacter = character;
11         }
12 
13         public override void Show()
14         {
15             this._BaseCharacter.Show();
16         }
17     }

这里是第二层

    /// <summary>
    /// 头盔装饰器
    /// </summary>
    public class DecoratorHelmet : BaseDecorator
    {
        private BaseCharacter _BaseCharacter = null;

        public DecoratorHelmet(BaseCharacter character) : base(character)
        {
            this._BaseCharacter = character;
        }
        public override void Show()
        {
            this._BaseCharacter.Show();
            Console.WriteLine("我获取到一个银鳞头盔");
        }
    }

首先基类继承了角色基类,然后头盔装饰类继承于装饰基类,然后通过构造的方法指定了上一层方法的内存地址,输出的时候先调用了父类的内存地址指向的方法,

再调用自身的方法。对父类进行了封装,依次类推,后面要加什么功能,只要在在使用装饰头盔这样来实现封装即可。

技术分享图片

技术分享图片这样你想要他组合什么功能,只需要动态的去生成,这里从原来的32个子类才能实现的多种组合,

这里只需要五个子类就能完成(也就是说通过继承的方式其实改变了原来的代码,在设计模式原则是,多使用组合,少使用继承)

这里注意一点就是,这些类都必须继承于同一个基类。装饰模式适用于不想改变原文件,而可以动态扩展新功能的场景

 

以上是关于设计模式之装饰模式(Decorator)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式---单一职责模式之装饰模式(Decorator)

设计模式之——Decorator模式

C++之装饰(decorator)模式

设计模式之装饰(Decorator)模式

Head First设计模式之装饰者模式(Decorator Pattern)

JAVA SCRIPT设计模式--结构型--设计模式之Decorator装饰模式