欧洲杯线上买球-设计模式之旅-10 装饰图案

本文摘要:虽然现在房价还很高,甚至我所在的成都郊区(非中心城市)的平均房价已经超过了一万元,但仍然不能阻挡大家对新房的希望和买房的热情。

虽然现在房价还很高,甚至我所在的成都郊区(非中心城市)的平均房价已经超过了一万元,但仍然不能阻挡大家对新房的希望和买房的热情。如果你买了干净的房子,毫无疑问还有另一个艰巨的任务等着你,那就是装修。新房子的装修并没有改变住宅的本质,但是可以让房子更加美观、温馨、实用。在软件设计上,也有类似新房装修的技术,可以对现有功能进行扩展,越来越满足用户的需求,从而使得工具功能更加强大。

这是这次将要介绍的装饰器模式。装饰者模式的学习难度:使用频率:1。

GUI组件库设计1.1景观匹配需求:m公司开发部开发了一套基于OO技术的GUI组件库Visual Component,提供了大量的基本组件,如表单、文本框、列表框等。当使用这个组件库时,用户经常需要定制一些特殊的显示效果。例如,带有旋转条的窗口、带有深黑色边框的文本框、带有旋转条和深黑色边框的列表框等。

所以往往需要对构件库进行扩展来增强其功效,如下图所示:如何提高GUI构件库的可扩展性,降低其维护成本,是M公司开发部门的French apes必须面对的问题。1.2初步设计针对以上需求,m公司的开发人员提出了一个基于持续复用的初步设计方案,其基本结构如下图所示:通过对设计方案过多的分析,不难发现以下问题:(1)系统扩展性差,基础无法用C#/Java实现(不支持多续)。(2)代码重复,修改维护系统不吉利。

(3)系统庞大,类多。总之,这个设计并不好。如何使系统易于扩展而不导致类数线性增加?来认识一下装饰类。

二.装饰器模式概述2.1装饰器模式简介装饰器模式可以在不改变工具自身功效的情况下为工具添加特殊的新行为。现实生活中,这种情况也是到处存在的。比如一张照片可以在不改变自身的情况下加上相框,这样就有防潮的效果。而且用户可以给它添加不同类型的相框,甚至可以在小相框外面设置一个大相框。

装饰模式:动态地给工具增加一些额外的责任。就提高工具效率而言,装饰模式远比子类化更灵活。

Decorator pattern是一个工具结构模型2.2 decorator pattern结构从结构图中可以看出,decorator pattern主要有以下几个作用:(1)Component(抽象组件):详细组件和抽象装饰类的基类,它明确定义了在详细构造中实现的业务方法。(2)具体组件:抽象组件的子类,用于定义详细的组件工具,实现抽象组件中声明的方法,decorator可以给它添加额外的职责(方法)。(3)Decorator(抽象装饰类):它也是抽象组件类的子类,用于给详细组件添加职责,但是详细职责是在其子类中实现的。

(4)混凝土装饰器:抽象装饰类的一个子类,它努力给组件增加新的职责。3.重构GUI组件库3.1重构设计方案为了使系统更加灵活和可扩展,克服持续重用带来的问题,M公司的开发人员使用decorator模式重构GUI库的设计,其中部门类的基本结构如下图所示:组件作为抽象组件类,其子类Window、TextBox、ListBox作为详细组件类。ComponentDecorator作为抽象的装饰类,ScrollBarDecorator和BlackBorderDecorator作为详细的装饰类。3.2 重构后的代码实现(1)抽象构件:组件//摘要///抽象界面构件类:抽象构件类////汇总公共抽象类组件{公共抽象void Display();}(2)详细构件:窗口,文本框和ListBox////summary///窗体类:详细构件类////汇总公共类窗口:组件{公共覆盖无效显示(){控制台.” WriteLine(“显示窗体!’);} } ///summary ///文本框类:详细构件类////summary public class TextBox : Component { public override void Display(){ Console .” WriteLine(“显示文本框!’);} } ///summary ///列表框类:详细构件类////汇总公共类列表框:组件{公共覆盖无效显示(){控制台.” WriteLine(“显示列表框!’);} }(3)抽象装饰:ComponentDecorator ///摘要> /// 构件装饰类:抽象装饰类 /// </summary> public class ComponentDecorator : Component { private Component component; public ComponentDecorator (Component component) { this.component = component; } public override void Display() { component.Display(); } }  (4)详细装饰:ScrollBarDecorator 和 BlackBorderDecorator /// <summary> /// 转动条装饰类:详细装饰类 /// </summary> public class ScrollBarDecorator : ComponentDecorator { public ScrollBarDecorator(Component component) : base(component) { } public override void Display() { this.SetScrollBar(); base.Display(); } public void SetScrollBar() { Console.WriteLine("为构件增加转动条!"); } } /// <summary> /// 玄色边框装饰类:详细装饰类 /// </summary> public class BlackBorderDecorator : ComponentDecorator { public BlackBorderDecorator(Component component) : base(component) { } public override void Display() { this.SetScrollBar(); base.Display(); } public void SetScrollBar() { Console.WriteLine("为构件增加玄色边框!"); } }  (5)客户端测试 public class Program { public static void Main(string[] args) { Component component = new Window(); // 一次装饰 Component componentSB = new ScrollBarDecorator(component); componentSB.Display(); Console.WriteLine(); // 二次装饰 Component componentBB = new BlackBorderDecorator(componentSB); componentBB.Display(); Console.ReadKey(); } }  执行后的效果如下图所示:    可以看到,第一次装饰之后,窗体有了转动条。

第二次装饰之后,窗体不仅有了转动条,还增加了玄色边框。四、装饰模式小结4.1 主要优点  (1)对于扩展一个工具的功效,装饰模式比继续越发灵活 => 不会导致类的个数急剧增加!  (2)可以对一个工具举行多次装饰,从而缔造出许多差别行为的组合 => 获得功效更为强大的工具!  (3)详细构件类与详细装饰类可以独立变化,可以凭据需要增加新的详细构建和详细装饰 => 原有代码无需修改,切合开放关闭原则!4.2 主要缺点  虽然装饰模式拱了一种比继续越发灵活灵活的方案,但同时也意味着比继续越发易于堕落,排错也很难题。特别是经由多次装饰的工具,调试时寻找错误可能需要逐级排查,较为繁琐。4.3 应用场景  (1)在不影响其他工具的情况下,想要动态地、透明地给单个工具添加职责 => 接纳装饰模式吧!  (2)当不能接纳继续的方式对系统举行扩展 或 接纳继续倒霉于系统扩展和维护时 => 接纳装饰模式吧!参考资料    刘伟,《设计模式的艺术—软件开发人员内功修炼之道》。

本文关键词:欧洲杯线上买球

本文来源:欧洲杯线上买球-www.sxkyytky.com