Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux集群 > Architecture > » 正文

装饰模式--Decorator pattern

来源: jtlyuan 分享至:

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

UML图如下:



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

  • 大小: 432.9 KB
  • 查看图片附件

Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史