• 设计模式学习--装饰者模式(Decorator Pattern)


    概念:

    装饰者模式(Decorator Pattern): 动态地将功能添加到对象,相比生成子类更灵活,更富有弹性.

    解决方案:

    装饰者模式的重点是对象的类型,装饰者对象必须有着相同的接口,也就是有着相同的结构.这样一来,在运行的过程中,就可以将这些对象融合在一起,将相同的属性等成员有机的结合,就像生成另外一种类型一样,而实际上,我们并不需要真的创建这个类型,它是动态生成的.这些装饰者既可以组合,也可以撤销组合,既回复到原来对象状态.

    示例介绍:

    装饰者模式的关键就是装饰者类型的定义,而其中应包括组合操作的方法.

    现在我们看一下装饰者接口的定义:

        /// <summary>
        /// 装饰者模式模型,接口
        /// </summary>
        public interface IDecorator
        {
            string Name { get; }
            int Sum { get; }
            void Add(IDecorator decorator);
        }
     
    接下来是装饰者类CDecorator类的定义:
        /// <summary>
        /// 装饰者类
        /// </summary>
        public class CDecorator:IDecorator
        {
            private string myName;
    
            private int mySum;
    
            private ArrayList myDecorator;
    
            public CDecorator()
            {
                myName = "";
                mySum = 0;
                myDecorator = new ArrayList();
            }
    
            //只读属性,名称
            public string Name
            {
                get
                {
                    string result = myName;
                    foreach (IDecorator d in myDecorator)
                    {
                        result += ", " + d.Name;
                    }
                    return myName;
                }
            }
    
            //只读属性,合计值
            public int Sum
            {
                get
                {
                    int result = mySum;
                    foreach (IDecorator d in myDecorator)
                    {
                        result += d.Sum;
                    }
                    return mySum;
                }
            }
    
            //添加装饰者对象
            public void Add(IDecorator decorator)
            {
                myDecorator.Add(decorator);
            }
        }
     
    下面我们通过代码测试下这个模型:
        //应用测试
        class Program
        {
            static void Main(string[] args)
            {
                CDecorator decoratorA = new CDecorator("decoratorA", 1);
                CDecorator decoratorB = new CDecorator("decoratorB", 2);
                CDecorator decoratorC = new CDecorator("decoratorC", 3);
                
                decoratorA.Add(decoratorB);
                decoratorA.Add(decoratorC);
    
                Console.WriteLine(decoratorA.Name);
                Console.WriteLine(decoratorA.Sum);
    
                Console.Read();
            }
        }
    运行结果如下:
    QQ图片20130907112029
     
     

    应用特点

    使用装饰者模式时应注意以下特点:

    • 因装饰者模式一般用于动态组合对象,所以,他们一般都是临时性的,在这个模型中,我们并没有添加取消组合功能.如果需要,你可以在IDecorator接口中添加Remove()方法,并在CDecorator类中实现它.
    • 不需要创建新的类型,就可以修改对象的特性(如对象的各种属性值),从而影响了对象的行为,就像创建了一个新的对象类型一样.
    • 需要创建很多的相同结构的装饰者对象,以便于组合.

    结束语

    不要强硬的去理解设计模式,也不要强硬的去套用它的形式,你所要做的是理解它的技巧以及思想,慢慢体会你才会理解它的妙用,这是我的一点体会,希望大神多多拍砖.如果感觉不错,请推荐****

  • 相关阅读:
    javaScript快速入门
    解决编程式路由往同一地址跳转时会报错的情况
    babel 依赖
    路由拆分可以达到一定程度的性能优化
    正则的扩展
    设计模式
    mysql数据库
    php基本语法
    事件循环
    面向对象编程
  • 原文地址:https://www.cnblogs.com/smiler/p/3307081.html
Copyright © 2020-2023  润新知