《人靠衣装,美靠靓装-装饰模式》

人靠衣装,美靠靓装,代码亦如是。

装饰模式为结构型模式,又名外观模式,它可以动态地给一个对象添加一些额外的职责,从增加功能来讲,装饰模式比生成子类更为灵活。

世间万物都是优缺点并存的,装饰也不例外。

优点:第一,装饰模式与继承关系都有同一个目标,扩展对象的功能,但相对而言,前者更为灵活。(灵活性高)

           第二,通过具体的装饰类以及这些的类的排列组合,设计不同行为的组合。(百变大咖秀)

缺点:第一,灵活性较高,导致复杂性增加

          第二,本身的运用会出现更多的小类,代码繁多而复杂。(复杂)

          第三,针对抽象组件进行编程。(抽象组件)

西湖乃是谈妆浓抹总相宜,然装饰模式为因地制宜。

合适的“土地”:
1. 需要扩展一个类的功能,或给一个类添加附加职责。
2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

没有规矩不成方圆,装饰模式也具有自己的原则:
首先, 多用组合,少用继承。
其次,类应设计的对扩展开放,对修改关闭。

一张图胜过千言万语


                                                                              理论指导实践

<span style="font-size:18px;">//Component类
    abstract class Component
    {
        public abstract void Operation();
    }</span>
<span style="font-size:18px;">//ConcreateComponent类
    class ConcreteComponent:Component 
    {
        public override void Operation()
        {
            Console.WriteLine("具体对象的操作");
        }
    }</span>
<span style="font-size:18px;"> abstract class Decorator:Component 
    {
         //Decorator类
         protected Component component;
         public void SetComponent(Component component)
         {
             this.component = component;
         }
         public override void Operation()
         {
             if (component != null)
             {
                 component.Operation();
             }
         }
    }</span>

<span style="font-size:18px;">//ConcreateDecorator类
    class ConcreteDecoratorA:Decorator 
    {
        private string addedState;
        public override void Operation()
        {
            base.Operation();
            addedState = "New State";
            Console.WriteLine("具体装饰对象A的操作");
        }
    }
    class ConcreteDecoratorB : Decorator
    {
        private string AddBehavior;
        public override void Operation()
        {
            base.Operation();
            AddBehavior();
            Console.WriteLine("具体装饰对象B的操作");
        }

        private void AddBehavior()
        {
        }
    }</span>
<span style="font-size:18px;"> //客户端代码
        static void Main(string[] args)
        {
            ConcreteComponent c = new ConcreteComponent();
            ConcreteDecoratorA d1 = new ConcreteDecoratorA();
            ConcreteDecoratorB d2 = new ConcreteDecoratorB();

            d1.SetComponent(c);
            d2.SetComponent(d1);
            d2.Operation();

            Console.Read();
        }</span>
以上为装饰模式的模板,在运用此模式可根据这样的模式来进行相应的设计。
                                                                   表格助你一臂之力
 

                                                                                  一己之见

       装饰模式定义一个接口,后台工作无需知道,一旦输入相应的要求,便会出现相应的结果,这个结果是一个成品,具体运作的过程不会出现。好比我们从电视上看到的光鲜靓丽的明星,我们看到的只是外部的表现,至于他们是如何奋斗,如何联系,如何包装,我们都无从知晓,我们只看到了结果。

对于设计模式理解尚浅,欢迎小伙伴多多提建议。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值