《大话设计模式》——装饰模式

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

通过定义装饰抽象类,该类有一个被装饰类对象的引用。


类代码:

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

namespace ConsoleApplication1
{
    abstract class Component
    {
        public abstract void Operation();
    }

    class ConcreteComponent : Component
    {
        public override void Operation()
        {
            Console.WriteLine("具体对象的操作");
        }
    }

    abstract class Decorator : Component
    {
        protected Component component;  //包含了一个Component类对象

        public void SetComponent(Component component)
        {
            this.component = component;
        }

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

    class ConcreteDecoratorA : Decorator
    {
        private string addedState;

        public override void Operation()
        {
            base.Operation();   //在基类的基础上进行了扩展(修饰)
            addedState = "New State";
            Console.WriteLine("具体装饰对象A的操作");
        }
    }

    class ConcreteDecoratorB : Decorator
    {
        public override void Operation()
        {
            base.Operation();   //在基类的基础上进行了扩展(修饰)
            AddedBehavior();
            Console.WriteLine("具体装饰对象B的操作");
        }

        private void AddedBehavior()
        { }
    }
}
客户端代码实现:

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

namespace ConsoleApplication1
{
    class Program
    {
        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();
        }
    }
}
执行结果: 《大话设计模式》——装饰模式_第1张图片


可以理解为,针对同一个对象的操作(装饰/功能扩展)有很多步骤,每操作一步,这个对象就变成了一个全新的对象(本质(抽象类)没变)。

对原来类功能的修饰性添加。

总结:

装饰模式:是为已有功能动态地添加更多功能的一种方式。

什么时候用呢?当系统需要新功能的时候,向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为。

优点:有效地把类的核心职责和装饰功能区分开,可以去除相关类中重复的装饰逻辑(不光是有新需求时可以用;可以一开始就设计成这样的,减少了类的复杂程度)。

你可能感兴趣的:(《大话设计模式》——装饰模式)