装饰者模式

一、定义

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

当想给对象添加额外的功能或者想随意组织对象的功能的时候可以用装饰者模式。

这个模式的精髓在于装饰者继承自要装饰的对象并且设置自己要装饰的对象,然后执行要装饰对象的功能。具体的装饰者执行完父类装饰的功能之后还可以执行自己的功能。

 

二、UML图

clipboard

 

三、例子展示

namespace 装饰者模式
{
    // 对应UML中的ConcreteComponent
    public class Phone
    {
        public virtual void Show()
        {
            Console.WriteLine( "手机加装饰:");
        }
    }

    // 装饰者
    public class PhoneDecorator : Phone
    {
        private Phone _phone;

        public void SetPhone(Phone phone)
        {
            this._phone = phone;
        }

        public override void Show()
        {
            _phone.Show();
        }
    }

    // 手机链装饰
    public class ChainDecorator : PhoneDecorator
    {
        public override void Show()
        {
            base.Show();
            Console.Write("装饰链");
        }
    }

    // 手机壳装饰
    public class ShellDecorator : PhoneDecorator
    {
        public override void Show()
        {
            base.Show();
            Console.Write("手机壳");
        }
    }

    // 手机膜装饰
    public class FilmDecorator : PhoneDecorator
    {
        public override void Show()
        {
            base.Show();
            Console.Write("手机膜");
        }
    }

    public class Client
    {
        // 使用方法
        public static void Process()
        {
            Console.WriteLine();
            // 构造手机
            Phone phone = new Phone();

            // 装饰链
            ChainDecorator chain = new ChainDecorator();
            chain.SetPhone(phone);// 要装饰的手机
            chain.Show();
            Console.WriteLine();
                       
            // 装饰链+手机壳+手机膜
            ShellDecorator shell = new ShellDecorator();
            shell.SetPhone(chain);// 装饰带装饰链的手机
            FilmDecorator film = new FilmDecorator();
            film.SetPhone(shell);
            film.Show();
        }
    }
}
View Code

 

四、总结

装饰者模式通过组合而非继承的方式可以随意的组合功能,避免通过继承增加功能的灵活性差的缺点。并且复合面向对象的设计原则“优先使用组合而非继承”和“开放-封闭”原则。

posted on 2016-12-01 16:17  zh1990  阅读(172)  评论(0编辑  收藏  举报

导航