zoukankan      html  css  js  c++  java
  • 4 装饰者模式

    装饰者模式(Decorator):动态地将职责附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

    UML如下:

    按照《大话》的解释:Component定义了一个对象接口(超类型),可以给这些对象动态地添加职责。ConcreteComponent是一个具体的对象,接下来的实例代码主要给这个对象添加职责。Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能。但对于Component来说,无需知道Decorator的存在,ConcreteComponent是具体的装饰对象,起到给Component添加职责的功能。

    具体代码如下:

     1 public abstract class Component
     2     {
     3         public abstract void Operate();
     4     }
     5     public abstract class Decorator : Component
     6     {
     7         Component c;
     8         public Decorator(Component cc)
     9         {
    10             c = cc;
    11         }
    12 
    13         public override void Operate()
    14         {
    15             c.Operate();
    16         }
    17 
    18     }
    19     public class ConcreteComponent : Component
    20     {
    21         public override void Operate()
    22         {
    23             Console.Write("ConcreteComponent");
    24         }
    25     }
    26     public class ConcreteDecoratorA : Decorator
    27     {
    28         public ConcreteDecoratorA(Component c) : base(c) { }
    29         public override void Operate()
    30         {
    31             base.Operate();
    32             Console.Write("+ConcreteDecoratorA");
    33         }
    34     }
    35 
    36     public class ConcreteDecoratorB : Decorator
    37     {
    38         public ConcreteDecoratorB(Component c) : base(c) { }
    39 
    40         public override void Operate()
    41         {
    42             base.Operate();
    43             Console.Write("+ConcreteDecoratorB");
    44         }
    45     }

    调用代码:

    1             Component c = new ConcreteComponent();
    2             c = new ConcreteDecoratorB(c);
    3             c = new ConcreteDecoratorA(c);
    4             c.Operate();

    具体装饰对象A和B的调用次序和个数可以任意组合,在这儿便可以体会到装饰者模式的极大灵活性。

    但这种设计方案在有些场合会导致装饰者类过多从来带来维护上的困难,实际应用中要注意这一点了。

    目前,始终无法很好地理解这种方法,先记录这么点,日后有深化了再来补充吧。

  • 相关阅读:
    Vue(小案例_vue+axios仿手机app)_go实现退回上一个路由
    nyoj 635 Oh, my goddess
    nyoj 587 blockhouses
    nyoj 483 Nightmare
    nyoj 592 spiral grid
    nyoj 927 The partial sum problem
    nyoj 523 亡命逃窜
    nyoj 929 密码宝盒
    nyoj 999 师傅又被妖怪抓走了
    nyoj 293 Sticks
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/5804904.html
Copyright © 2011-2022 走看看