C#设计模式09-装饰模式
2016-02-18 10:40
309 查看
装饰模式,简而言之就是给一件东西进行外表的装饰,但是并没有改变东西的本质。
我们对新房的装修并没有改变房子的本质结构,装饰模式就是对现有对象(新房)进行扩展(装修)使其具备更多的职责和功能。
定义:动态地给一个对象增加一个额外的职责。就扩展功能而言,装饰模式提供了一种比使用继承增加对象职责更加灵活的替代方案!
装饰模式主要包含四种角色:
1.Componennt(抽象构件):它是所有具体构件和抽象装饰者的父类,声明了在具体构建中需要实现的业务方法,可以使接口或者抽象类
2.ConcreteComponent(具体构件):它是抽象构件类的子类,实现抽象构件类中的业务方法。
3.Decorator(抽象装饰者):它是抽象装饰者,是所有具体装饰者的父类,用于给具体构件新增功能。
4.ConcreteDecorator(具体装饰者):它是抽象装饰者的子类,负责实现向抽象构件中新增功能。
现在以C#设计模式这本书中的案例来完成代码,假设公司开发了一套图形界面库,该界面库提供了基本的构建,如窗体,文本框,列表框。由于在使用时,还需为现有的构建添加特殊的显示效果,比如黑色边框的窗体,带滚动条的列表框。现在用装饰模式来设计该图像界面库。
下面是对应的类图
首先我们为图像界面库中所有的构建抽象出一个共同的父类VirsualComponent
在客户端代码中,我们为窗体新增(装饰)了一个滚动条,然后再显示。在这里componentSB充当装饰者,而component从当被装饰者。
所在,在不影响其他对象的前提下,想要对现有对象动态添加新职责和功能的时候,可以考虑使用装饰模式,而不是通过继承来解决。
装饰模式就介绍到这里,下一篇将介绍外观模式。
我们对新房的装修并没有改变房子的本质结构,装饰模式就是对现有对象(新房)进行扩展(装修)使其具备更多的职责和功能。
定义:动态地给一个对象增加一个额外的职责。就扩展功能而言,装饰模式提供了一种比使用继承增加对象职责更加灵活的替代方案!
装饰模式主要包含四种角色:
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从当被装饰者。
所在,在不影响其他对象的前提下,想要对现有对象动态添加新职责和功能的时候,可以考虑使用装饰模式,而不是通过继承来解决。
装饰模式就介绍到这里,下一篇将介绍外观模式。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Lua编程示例(二):面向对象、metatable对表进行扩展
- C#中面向对象编程机制之多态学习笔记
- 浅谈Lua的面向对象特性
- Lua面向对象之类和继承浅析
- JavaScript面向对象的两种书写方法以及差别
- 浅谈c# 面向对象之类与对象
- C#面向对象特征的具体实现及作用详解
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- C# 面向对象的基本原则
- 实例解析C#设计模式编程中简单工厂模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用
- 浅谈对c# 面向对象的理解