您的位置:首页 > 其它

4.5 《硬啃设计模式》 第22章 增加新方法的烦恼 - 访问者模式(Visitor Pattern)

2013-11-14 12:31 211 查看
有这么一个类,我们有可能需要增加n多的方法,但我们又不太想直接修改该类,你有什么好办法呢?


 

这个类是原来老系统的,我们想扩展它的功能,但又不太希望改变它的“接口”,或者说尽量少改变它的“接口”。
你看有什么办法,能在外面增加这个类的功能?

这样的要求也太强人所难了吧?不能动它,又要增加方法?
完全不改原来的类是不可能增加新方法的,我们要想办法开一个“小口”,通过这个“小口”来实现灵活增加它的功能。
访问者模式就是通过这个“小口”来访问原类,从而增强原类的功能。

应用了访问者模式的类图如下:


 

说明:
1.SomeClass的Accept()方法就是这个小口,Accept()方法只有一句代码,就是:visitor.NewMethod(this),这是访问者模式的精妙之处。
2.SomeClass的新功能通过实现IVisitor接口的类来实现。
2.如果要调用SomeClass的新功能,只需要调用它的Accept()方法并传入实现了新功能的Visitor便可。

现在麻烦来了,要增加方法的类不止一个,而是很多个!咋办?
你可能会想,那还不容易,针对每一个类,用前面说的方法就OK了!不过这样就有很多Visitor了,有没有更好的办法?

我们看看访问者模式的完整类图:


 

说明:
1.要对多少个类增加新方法,接口IVisitor就需要定义多少个方法,IVisitor是和原来的类绑死的。
2.如果老是有新类加入到原来的类中,不适用访问者模式。
3.需要不改变原来类结构而增加新功能时,可考虑访问者模式。

访问者模式的一些用途:
1.对老系统的改造:对象的结构很少改变,但需要在此结构上增加新的操作。
2.需要对集合、树等对象结构进行遍历,实现某些新操作,希望能随时修改或增加这些操作。
  例1:将所有的product价钱提高10%.
  例2:对某文件夹下面的所以文件夹和文件的名称进行中文检测。
  例3:对表达式树进行语法检测。

请看下一文……  作者:张传波创新工场创业课堂(敏捷课程)讲师软件研发管理资深顾问CMMI首席专家《火球——UML大战需求分析》作者www.umlonline.org创办人
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: