读书人

装饰模式-Decorator pattern

发布时间: 2012-06-28 15:20:04 作者: rapoo

装饰模式--Decorator pattern

定义:动态地给一个对象增加其他职责,就增加对象的功能来说,装饰模式比生成子类实现更为灵活。

UML图如下:


装饰模式-Decorator pattern


?

Code:
  1. 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象和抽象装饰器。???
  2. 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。???
  3. 抽象装饰—ecorator)角色:持有一个构件(Component)对象的实例,以用来对它进行装饰,并定义一个与抽象构件接口一致的接口。???
  4. 具体装饰(Concrete?Decorator)角色:负责给构件对象"加上"附加的功能。??
  5. ??
  6. 结构图代码:??
  7. ????//抽象构件,定义了具体构件和抽象装饰要实现的方法??
  8. ????interface?Component??
  9. ????{??
  10. ????????void?Operation();??
  11. ????}??
  12. ????//定义具体构件??
  13. ????class?ConcreteComponent?:?Component??
  14. ????{??
  15. ????????public?void?Operation()??
  16. ????????{??
  17. ????????????Console.WriteLine("ConcreteComponent?Operation");??
  18. ????????}??
  19. ????}??
  20. ????//定义抽象装饰者。抽象装饰者也实现了抽象构件的接口??
  21. ????abstract?class?Decorator?:?Component??
  22. ????{??
  23. ????????//把一个抽象构件作为抽象装饰的成员变量。??
  24. ????????protected?Component?comp;??
  25. ???????//在抽象装饰者的构造函数中为抽象构件初始化。???
  26. ????????public?Decorator(Component?c)??
  27. ????????{??
  28. ????????????this.comp?=?c;??
  29. ????????}??
  30. ???????//还未实现的接口的方法。???
  31. ????????public?abstract?void?Operation();??
  32. ????}??
  33. ????//具体装饰者A,继承自抽象装饰。??
  34. ????class?ConcreteDecoratorA?:?Decorator??
  35. ????{??
  36. ????????private?string?addedState;?//具体装饰者中新增的成员变量??
  37. ????????public?ConcreteDecoratorA(Component?c)?:?base(c)?{?}??
  38. ????????public?string?AddedState???//具体装饰者中新增的属性??
  39. ????????{??
  40. ????????????set??
  41. ????????????{??
  42. ????????????????addedState?=?value;??
  43. ????????????}??
  44. ????????}??
  45. ???????//具体装饰者实现了接口中定义的方法???
  46. ????????public?override?void?Operation()??
  47. ????????{??
  48. ????????????comp.Operation();????//可以调用原构件对象的Operation方法。??
  49. ????????????Console.WriteLine("ConcreteDecoratorA?Operation?{0}",addedState);??
  50. ????????}??
  51. ????}??
  52. ????//具体装饰者B,继承自抽象装饰。??
  53. ????class?ConcreteDecoratorB?:?Decorator??
  54. ????{??
  55. ????????public?ConcreteDecoratorB(Component?c)?:?base(c)?{?}??
  56. ????????public?override?void?Operation()??
  57. ????????{??
  58. ????????????comp.Operation();?//可以调用原构件对象的Operation方法。??
  59. ????????????Console.WriteLine("ConcreteDecoratorB?Operation?");??
  60. ????????}??
  61. ???????//?具体装饰者实现了接口中定义的方法???
  62. ????????public?void?AddedBehavior()??
  63. ????????{??
  64. ????????????Console.WriteLine("This?is?Added?Behavior");??
  65. ????????}??
  66. ????}??
  67. ????class?Client??
  68. ????{??
  69. ????????public?static?void?Main()??
  70. ????????{??
  71. ????????????//原生的具体构件???
  72. ????????????ConcreteComponent?cc?=?new?ConcreteComponent();??
  73. ????????????cc.Operation();??
  74. ????????????//把原生的具体构件用具体装饰者A进行一次包装??
  75. ????????????ConcreteDecoratorA?cda?=?new?ConcreteDecoratorA(cc);??
  76. ????????????cda.AddedState?=?"Decorator?OK?";??
  77. ????????????cda.Operation();??
  78. ???????????//把原生的具体构件用具体装饰者B进行一次包装???
  79. ????????????ConcreteDecoratorB?cdb?=?new?ConcreteDecoratorB(cc);??
  80. ????????????cdb.AddedBehavior();??
  81. ????????????cdb.Operation();??
  82. ???????????//把被A包装完的具体构件再用用具体装饰者B进行二次包装???
  83. ????????????ConcreteDecoratorB?cdbcda?=?new?ConcreteDecoratorB(cda);??
  84. ????????????cdbcda.Operation();??
  85. ????????}??
  86. ????}??
  87. ?Decorator与Component之间既是Is a...的继承关系,又是Has a...的组合关系。使用具体装饰类(ConcreteDecorator)来装饰具体构件对象(ConcreteComponent),装饰完的对象依旧是个Component类型。
    ??? Decorator模式解决的是类的功能的多向扩展,而不是单纯的类的继承。
    ??? Decorator模式提供了比继承更灵活的功能扩展,通过使用不同具体装饰对构件对象的排列组合地包装,能够不同功能的组合。

?

读书人网 >软件架构设计

热点推荐