C#设计模式09-装饰模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bhdxmaomi/article/details/50684066

装饰模式,简而言之就是给一件东西进行外表的装饰,但是并没有改变东西的本质。

我们对新房的装修并没有改变房子的本质结构,装饰模式就是对现有对象(新房)进行扩展(装修)使其具备更多的职责和功能。

定义:动态地给一个对象增加一个额外的职责。就扩展功能而言,装饰模式提供了一种比使用继承增加对象职责更加灵活的替代方案!

装饰模式主要包含四种角色:

1.Componennt(抽象构件):它是所有具体构件和抽象装饰者的父类,声明了在具体构建中需要实现的业务方法,可以使接口或者抽象类

2.ConcreteComponent(具体构件):它是抽象构件类的子类,实现抽象构件类中的业务方法。

3.Decorator(抽象装饰者):它是抽象装饰者,是所有具体装饰者的父类,用于给具体构件新增功能。

4.ConcreteDecorator(具体装饰者):它是抽象装饰者的子类,负责实现向抽象构件中新增功能。

现在以C#设计模式这本书中的案例来完成代码,假设公司开发了一套图形界面库,该界面库提供了基本的构建,如窗体,文本框,列表框。由于在使用时,还需为现有的构建添加特殊的显示效果,比如黑色边框的窗体,带滚动条的列表框。现在用装饰模式来设计该图像界面库。

下面是对应的类图


首先我们为图像界面库中所有的构建抽象出一个共同的父类VirsualComponent

    abstract class VirsualComponent//充当抽象构件
    {
        public abstract void Display();
    }
然后是它的三个子类(具体构件):窗体Window,文本框TextBox,列表框ListBox

    class Window:VirsualComponent
    {
        public override void Display()
        {
            Console.WriteLine("显示窗体!");
        }
    }
    class TextBox:VirsualComponent
    {
        public override void Display()
        {
            Console.WriteLine("显示文本框!");
        }
    }
    class ListBox:VirsualComponent
    {
        public override void Display()
        {
            Console.WriteLine("显示列表框!");
        }
    }
接下来是抽象装饰者ComponentDecorator,也是所有具体装饰者的父类
    class ComponentDecorator:VirsualComponent//构件装饰者,充当抽象装饰者
    {
        private VirsualComponent component;
        public ComponentDecorator(VirsualComponent component)
        {
            this.component = component;
        }

        public override void Display()
        {
            component.Display();
        }
    }
然后是两个具体的装饰者ScrollbarDecorator和BackBorderDecorator
    class ScrollbarDecorator:ComponentDecorator
    {
        public ScrollbarDecorator(VirsualComponent component)
            : base(component)
        { 
        }
        public override void Display()
        {
            SetScrollBar();
            base.Display();
        }
        private void SetScrollBar()
        {
            Console.WriteLine("为构件新增滚动条!");
        }
    }
    class BackBorderDecorator:ComponentDecorator
    {
        public BackBorderDecorator(VirsualComponent component)
            : base(component)
        { 
        }
        public override void Display()
        {
            SetBackBorder();
            base.Display();
        }
        private void SetBackBorder()
        {
            Console.WriteLine("为构件新增黑色边框!");
        }
    }
客户端代码如下:

        static void Main(string[] args)
        {
            VirsualComponent component, componentSB;
            component = new Window();//定义具体构件
            componentSB = new ScrollbarDecorator(component);//使用装饰者装饰原有构件
            componentSB.Display();
            Console.ReadLine();
        }
来看看最后的运行结果



在客户端代码中,我们为窗体新增(装饰)了一个滚动条,然后再显示。在这里componentSB充当装饰者,而component从当被装饰者。

所在,在不影响其他对象的前提下,想要对现有对象动态添加新职责和功能的时候,可以考虑使用装饰模式,而不是通过继承来解决。

装饰模式就介绍到这里,下一篇将介绍外观模式。

猜你喜欢

转载自blog.csdn.net/bhdxmaomi/article/details/50684066
今日推荐