Decorator Pattern

<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><![endif]--> <!--[if gte mso 10]> <![endif]-->

博客员中这位高手的例子.记录日志.

在软件系统中,我们会使用继承来扩展对象的功能,随着功能的扩展,子类的增多,会导致更多的子类的膨胀.为了解决这个问题,便产生了装饰模式(DecoratorPattern)

动态的给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活.[GOF设计模式]

我们来使用这位高手的例子,数据库的日志的记录.我们已经有写好了的Log类及DatabaseLog, 来实现数据日志的记录工作.

  1. public abstract class Log
  2. {
  3.     {
  4.         public abstract void Write(string log);
  5.     }
  6. }
  7.     
  8. public class DatabaseLog:Log
  9. {
  10.     public override void Write(string log)
  11.     {
  12.         //throw new NotImplementedException();
  13.         //记录日志
  14.     }
  15. }

<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><![endif]--> <!--[if gte mso 10]> <![endif]-->

不要有太多的问题,上面的类是已经实现的,用来记录日志的. 假如万恶的资本家又有了新的需求怎么办? Steven请你给这个再加一个功能,让他可以记录错误的级别吧.

题外话,一些我对装饰模式的理解:

固然,我们可以在类中实现,再加上一个方法.比如说public override ovidSetError(),但是问题是,如果我们加上了这个方法. new出来实例引用的时候,就要instant.Write(),instant.SetError().我对这个倒是可以接受,只是高手中提到这个破坏了类的单一性原则.在面向对象这一块,我掌握的不是很好,不甚理解.回去要找本书好好看看, 可能是这个破坏了类的单一性???

我们用装饰模式来实现. 要装饰,就先做一个装饰的类.装饰嘛,就是在原来的基础上再加点什么.

  1. public abstract class LogWrapper:Log
  2. {
  3.     private Log _log;
  4.     public LogWrapper(Log log)
  5.     {
  6.         _log = log;
  7.     }
  8.     public override void Write(string log)
  9.     {
  10.         //throw new NotImplementedException();
  11.         _log.Write(log);
  12.     }
  13. }
<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><![endif]--> <!--[if gte mso 10]> <![endif]-->

这个类继承于Log,他重载了Log中的Write方法.

为什么要这么用呢? 我们的扩展功能SetError是要继承于LogWrapper,LogWrapper相当一个包装盒,他即具有Log类的一切特质,又为其派生的类提供了一个接口.

  1. public class LogErrorWrapper:LogWrapper
  2. {
  3.     public LogErrorWrapper(Log _log)
  4.        : base(_log)
  5.     { }
  6.     public override void Write(string log)
  7.     {
  8.         //Run some extenal features
  9.         //SetError()
  10.         base.Write(log);
  11.     }
  12. }
<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><![endif]--> <!--[if gte mso 10]> <![endif]-->

LogErrorWrapper即是继承自LogWrapper.  然后LogErrorWrapper又重载了其父类的Write方法,在实现了一系列的其它工作之后”SetError()”,回过来执行其父类的Write()方法,所需要的只是提供一个他父类所需要的对象而已.

前台的调用办法

  1. Log log = new DatabaseLog();
  2. LogWrapper lew1 = new LogErrorWrapper(log);
  3. lew1.Write("Log Message");
可见,Log中的Write方法在LogWrapper中又被包装了一次.

Confusion: 类的单一性是什么? 类除了具有单一性之外,还应该具备一些其它什么样的特征呢? 面向对象这一课应该好好补一下了.


<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><![endif]--> <!--[if gte mso 10]> <![endif]--> 例子和一些方法引用自 http://terrylee.cnblogs.com/archive/2006/03/01/340592.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值