【大话设计模式】——装饰模式

一、概念

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


二、UML图


Component(被装饰对象基类): 定义对象的接口,可以给这些对象动态增加职责;

ConcreteComponent(具体被装饰的对象): 定义具体的对象,Decorator可以给它增加额外的职责;

Decorator(装饰者抽象类): 维护一个指向Component实例的引用,并且定义了与Component一致的接口;

ConcreteDecorator(具体装饰者): 具体的装饰对象,给内部持有的具体被装饰对象增加具体的职责。


【大话设计模式】——装饰模式_第1张图片


三、实例解析

  有一句很有道理话,想必大家都听过:没有丑女人,只有懒女人。有一张保养的很好的脸的确能给初次印象加不少的分数。我想大部分女生都知道,每个宿舍都有几个爱臭美的女生,早上起的特别早,在脸上抹了一层又一层,想知道是怎么个顺序吗?下面让我们进入这个小例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication9
{

    class Program//客户端代码
    {
        static void Main(string[] args)
        {
            Person xm = new Person("小美");
            Console.WriteLine("\n 基础护肤顺序:");

            Water shui = new Water();
            Lotion ruye = new Lotion();
            Sunscreen fangshai = new Sunscreen();
            Isolation geli = new Isolation();

            //擦护肤品的过程
            geli.Decorate(xm);
            fangshai.Decorate(geli);
            ruye.Decorate(fangshai );
            shui.Decorate(ruye);
            shui.Show();

        }
    }

    //Person类(ConcreteComponent)
    class Person
    {
        public Person()
        { }
        public string name;
        public Person(string name)
        {
            this.name = name;
        }
        public virtual void Show()
        {
            Console.WriteLine("的{0}",name );

        }
    }

    //保养品类(Decorator)
    class MakeUp : Person
    {
        protected Person component;
        public void Decorate(Person component)
        {
            this.component = component;

        }
        public override void Show()
        {
            if (component !=null)
            {
                component.Show();
            } 
        }
        
    
    }


    //具体保养品类(ConcreteDecorator)
    class Water : MakeUp
    {
        public override void Show()
        {
            Console.Write("水 ");
            base.Show();
        }
    }

    class Lotion : MakeUp
    {
        public override void Show()
        {
            Console.Write("乳液 ");
            base.Show();
        }
    }
    class Sunscreen : MakeUp
    {
        public override void Show()
        {
            Console.Write("防晒 ");
            base.Show();
        }
    }
    class Isolation : MakeUp
    {
        public override void Show()
        {
            Console.Write("隔离 ");
            base.Show();
        }
    }

}

运行结果:

【大话设计模式】——装饰模式_第2张图片


  该例子中运用到了装饰模式,其中特别要注意把所需的功能按照正确的顺序串联起来进行控制,比如例子中这些保养品的顺序是按照分子大小的顺序来涂抹的,小分子的先抹,大分子的后抹,如果顺序颠倒,保湿的进不去,隔离、防晒可能会伤及皮肤。



四、总结

装饰模式的优点:

1.它把每个要装饰的功能放在单独的类中,简化了原有类,并让这个类包装它所要装饰的对象。因此,当需要执行特殊行为时,客户端代码就可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象。

2.有效的把类的核心职责装饰功能区分开了。而且可以去除相关类中重复的装饰逻辑。

缺点:

1.装饰链不过长,否则会影响效率。

2.通过继承关系建立的关系是脆弱的,如果基类变,势必会影响对象的内部;组合建立的关系只会影响到被装饰对象的外部特征。

3.只有在必要的的时候使用装饰模式,否则会提高程序的复杂性,增加系统维护难度。


联系 策略模式:

装饰模式跟策略模式有很相似的一点就是简化功能,策略模式简化了客户端的代码,将业务逻辑和界面逻辑分开,装饰模式简化了类,将类中的装饰功能从类中搬移去除。


启发:

管理,要分工明确,核心职责突出,不能所有的活都干,要明确大方向,拥有全局观。




你可能感兴趣的:(设计模式,UML,装饰模式,策略模式)