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的调用次序和个数可以任意组合,在这儿便可以体会到装饰者模式的极大灵活性。

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

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

  • 相关阅读:
    java根据图片路径下载到服务器方案 (转)
    什么是JSP (转)
    获取给定月中哪些天有聊天记录
    患者咨询服务区数据获取
    获取 不在当前设置录入状态,但是曾经设定过的测量指标 的最后测量日期
    MySQL 常用函数之——substr()
    MySql查询时间段的方法(转)
    MySQL 百万级分页优化(Mysql千万级快速分页)(转)
    mysql的sql分页函数limit使用 (转)
    MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/5804904.html
Copyright © 2011-2022 走看看