您的位置:首页 > 编程语言 > C#

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

2016-02-18 10:40 309 查看
装饰模式,简而言之就是给一件东西进行外表的装饰,但是并没有改变东西的本质。

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

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

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

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从当被装饰者。

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

装饰模式就介绍到这里,下一篇将介绍外观模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息