1、在遵循开闭原则的基础上,当我们想给一个对象增加功能时,我们可以使用装饰模式的对象的关联关系替代继承关系,因为使用继承关系增加子类将会给系统增加非常多的子类,下面举例说明:
我们想开发一个软件界面库,这个库有文本框、标签、窗体对象三种,并且当我们开发完成之后,发现要为这几个对象增加一些功能,比如加上滚动条,加上黑色边框功能,假设我们使用继承,代码如下:
abstract class Component
{
public abstract void Display();
}
class WindowDisplay : Component
{
public override void Display()
{
Console.WriteLine("显示窗口");
}
}
class ScrollBar:WindowDisplay
{
public void SetScrollBar()
{
Console.WriteLine("为构件增加滚动条");
}
}
class BlackBoard:ScrollBar
{
public void SetBlackBoard()
{
Console.WriteLine("为构件增加黑色边框");
}
}
public Form1()
{
InitializeComponent();
BlackBoard component = new BlackBoard();
component.SetBlackBoard();
component.SetScrollBar();
component.Display();
}
我们可以看出当我们想要为WindowDisplay对象增加功能时,只能不停的增加一个子类,那么如果有同样的LabelDisplay也想增加诸如黑色边框以及滚动条之类的功能,这样就会导致系统中会有很多个类,那么我们可以换一种方法,也就是装饰模式来解决以上问题,装饰模式中有抽象装饰类,该类维持了对抽象构件类的引用,当我们想增加功能时,只需要增加具体的装饰类即可,代码如下:
abstract class Component
{
public abstract void Display();
}
class WindowDisplay : Component
{
public override void Display()
{
Console.WriteLine("显示窗口");
}
}
class ScrollBarDecorator:Decorator
{
public ScrollBarDecorator (Component component):base(component )
{
}
public override void Display()
{
this.SetScrollBar();
base.Display();
}
public void SetScrollBar()
{
Console.WriteLine("为构件增加滚动条");
}
}
class BlackBoardDec : Decorator
{
public BlackBoardDec(Component component)
: base(component)
{
}
public void SetBlackBorder()
{
Console.WriteLine("为构件增加黑色边框");
}
public override void Display()
{
this.SetBlackBorder();
base.Display();
}
}
public Form1()
{
InitializeComponent();
Component component = new WindowDisplay();
Component sb = new ScrollBarDecorator(component );
Component bb = new BlackBoardDec(sb);//这里将装饰了一次的对象又装饰了一次
bb.Display();
}
这里即使我们是相对TextBox增加黑色边框或者滚动条,都不再需要增加子类,而是直接装饰TextBox对象即可,省去了很多重复的子类代码。