<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><![endif]--> <!--[if gte mso 10]> <![endif]-->
博客员中这位高手的例子.记录日志.
在软件系统中,我们会使用继承来扩展对象的功能,随着功能的扩展,子类的增多,会导致更多的子类的膨胀.为了解决这个问题,便产生了装饰模式(DecoratorPattern)
动态的给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活.[GOF设计模式]
我们来使用这位高手的例子,数据库的日志的记录.我们已经有写好了的Log类及DatabaseLog类, 来实现数据日志的记录工作.
- public abstract class Log
- {
- {
- public abstract void Write(string log);
- }
- }
-
- public class DatabaseLog:Log
- {
- public override void Write(string log)
- {
-
-
- }
- }
<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><![endif]--> <!--[if gte mso 10]> <![endif]-->
不要有太多的问题,上面的类是已经实现的,用来记录日志的. 假如万恶的资本家又有了新的需求怎么办? Steven请你给这个再加一个功能,让他可以记录错误的级别吧.
题外话,一些我对装饰模式的理解:
固然,我们可以在类中实现,再加上一个方法.比如说public override ovidSetError(),但是问题是,如果我们加上了这个方法. 在new出来实例引用的时候,就要instant.Write(),instant.SetError().我对这个倒是可以接受,只是高手中提到这个破坏了类的单一性原则.在面向对象这一块,我掌握的不是很好,不甚理解.回去要找本书好好看看, 可能是这个破坏了类的单一性???
我们用装饰模式来实现. 要装饰,就先做一个装饰的类.装饰嘛,就是在原来的基础上再加点什么.
- public abstract class LogWrapper:Log
- {
- private Log _log;
- public LogWrapper(Log log)
- {
- _log = log;
- }
- public override void Write(string log)
- {
-
- _log.Write(log);
- }
- }
<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><![endif]--> <!--[if gte mso 10]> <![endif]-->
这个类继承于Log,他重载了Log中的Write方法.
为什么要这么用呢? 我们的扩展功能SetError是要继承于LogWrapper的,LogWrapper相当一个包装盒,他即具有Log类的一切特质,又为其派生的类提供了一个接口.
- public class LogErrorWrapper:LogWrapper
- {
- public LogErrorWrapper(Log _log)
- : base(_log)
- { }
- public override void Write(string log)
- {
-
-
- base.Write(log);
- }
- }
<!--[if gte mso 9]><![endif]--><!--[if gte mso 9]><![endif]--> <!--[if gte mso 10]> <![endif]-->
LogErrorWrapper即是继承自LogWrapper. 然后LogErrorWrapper又重载了其父类的Write方法,在实现了一系列的其它工作之后”SetError()”,回过来执行其父类的Write()方法,所需要的只是提供一个他父类所需要的对象而已.
前台的调用办法
- Log log = new DatabaseLog();
- LogWrapper lew1 = new LogErrorWrapper(log);
- 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