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

有这么一个类,我们有可能需要增加n多的方法,但我们又不太想直接修改该类,你有什么好办法呢?

访问者1.png  

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

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

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

访问者2.png  

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

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

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

访问者3.png  

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

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

  例3:对表达式树进行语法检测。


请看下一文……

 

 

作者:张传波

创新工场创业课堂(敏捷课程)讲师

软件研发管理资深顾问

CMMI首席专家

《火球——UML大战需求分析》作者

www.umlonline.org创办人


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张传波

打赏的朋友很帅噢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值