装饰模式

1.定义

Attach additonal responsibilities to an object dynamically keeping the same interface,Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更为灵活。)

2.模式说明

(1)Component抽象构件

Component是一个接口或者是抽象类,就是定义我们最核心的对象

(2)ConcreteComponent具体构件

ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。

(3)Decorator装饰角色

一般是抽象类,实现接口或抽象方法,在它的属性里必须有一个Private变量指向component抽象构件。

(4)具体的装饰角色

3.代码实现

    /// <summary>
    /// 抽象构件
    /// </summary>
    public abstract class Component
    {
        public abstract void Operate();

    }

    /// <summary>
    /// 具体的构件
    /// </summary>
    public class ConcreteComponent : Component
    {
        public override void Operate()
        {
//如果你直接这样告诉你妈妈,估计不得打死也会骂死,所以我们要对它进行修饰。 Console.WriteLine(
"妈妈妈妈,我只考到70分。"); } } public abstract class Decorator : Component { private Component _component; public Decorator(Component component) { _component = component; } public override void Operate() { _component.Operate(); } } public class ConcreteDecorator1 : Decorator { public ConcreteDecorator1(Component component) :base(component) { } private void DecoratorMethod1() { Console.WriteLine("妈妈妈妈,我班上最高的也才75分。"); } public override void Operate() { DecoratorMethod1(); base.Operate(); } } public class ConcreteDecorator2 : Decorator { public ConcreteDecorator2(Component component) : base(component) { } private void DecoratorMethod2() { Console.WriteLine("妈妈妈妈,我在班上排10多名呢。"); } public override void Operate() { DecoratorMethod2(); base.Operate(); } }
    /// <summary>
    /// 场景类
    /// </summary>
    class Program
    {

        private static void Main(string[] args)
        {
            Component component  = new ConcreteComponent();

            component = new ConcreteDecorator1(component);

            component = new ConcreteDecorator2(component);

            component.Operate();

            Console.ReadKey();
        }

    }

4.装饰模式的优缺点

(1)优点

.装饰类和被装饰类可以独立发展,而不会相互耦合。换句话说,Component类无须知道Decorator类,Decorator类是从外部来扩展Component类的功能,而Decorator也不用知道具体的构件。

.装饰模式是继承关系的一个替代关系。我们看装饰类Decorator,不管装饰多少层,返回的对象还是Component,实现的还是is-a的关系。继承是静态地给类增加功能,而装饰模式则是动态地增加功能。

.装饰模式可以动态地扩展一个实现类的功能。

(2)缺点

多层装饰是比较复杂的。因此,尽量减少装饰类的数量,以便降低系统的复杂度。

原文地址:https://www.cnblogs.com/JustYong/p/4588572.html