zoukankan      html  css  js  c++  java
  • 设计模式(1)装饰模式总结


    概述


    动态为对象添加额外的功能,相对以前利用子类继承来增加父类的功能来说。装饰模式更为简洁、灵活,更符合面向


    对象的原则。


    装饰模式结构图

    在Decorator类中,通过SetComponent构造函数来对Component对象进行设置,从而扩展Component的功能,

    namespace 装饰模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConcreteComponent c = new ConcreteComponent();
                ConcreteDecoratorA a = new ConcreteDecoratorA();
                ConcretedDecoratorB b = new ConcretedDecoratorB();
    
                a.SetComponent(c);
                b.SetComponent(a);
                b.Operation();
    
                Console.ReadLine();
            }
        }
        //Component类
        abstract class Component
        {
            public abstract  void Operation();
        }
        //ConcreteComponet类
        class ConcreteComponent : Component
        {
            public override void Operation()
            {
                Console.WriteLine("具体对象的操作!!!") ;
            }
        }
        //Decorator类
        abstract  class Decorator : Component
        {   
            //设置Component
            protected Component component;
            public void SetComponent (Component component)
            {
                this.component = component;
            }
            public override void Operation()
            {
                if (component != null)
                {
                    component.Operation();
                }
            }
        }
        //ConcreteDecoratorA类
        class ConcreteDecoratorA :Decorator 
        {
            private string addedState;
            public override void Operation()
            {
                base.Operation();
                addedState = "标识A的操作,以区别操作B!!!";
                Console.WriteLine ("具体对象A的操作!!!");
            }
        }
        //ConcreteDecoratorB类
        class ConcretedDecoratorB : Decorator
        {
            private string removeState;
            public override void Operation()
            {
                base.Operation();
                removeState = "标识操作B,以区别操作A!!!";
                Console.WriteLine("具体对象B的操作!!!");
            }
        }
    }
    


    最后调用的实际上是Component的方法。


    运行结果


    特点

    1、通过组合而非继承的方式,实现了动态扩展对象的功能的能力

    2、有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题

    3、充分利用了继承和组合的长处和短处,在灵活性和扩展性之间找到完美的平衡点

    4、装饰者和被装饰者之间虽然都是同一类型,但是它们彼此是完全独立并可以各自独立任意改变的

    5、遵守大部分grasp原则和常用设计原则,高内聚、低偶合


    6、在装饰过程过长的情况下,影响执行效率。

  • 相关阅读:
    由VMnet引起的browser-sync故障解决方案
    Gen8折腾日记
    实变函数笔记(1)——集合与基数
    密码学笔记(6)——复杂度及其相关内容
    微分几何笔记(1)——参数曲线、内积、外积
    密码学笔记(5)——Rabin密码体制和语义安全性
    密码学笔记(4)——RSA的其他攻击
    密码学笔记(2)——RSA密码
    密码学笔记(1)——数论准备知识
    第七章小结
  • 原文地址:https://www.cnblogs.com/guziming/p/4232752.html
Copyright © 2011-2022 走看看