有这么一个类,我们有可能需要增加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:对某文件夹下面的所以文件夹和文件的名称进行中文检测。
这个类是原来老系统的,我们想扩展它的功能,但又不太希望改变它的“接口”,或者说尽量少改变它的“接口”。
你看有什么办法,能在外面增加这个类的功能?
这样的要求也太强人所难了吧?不能动它,又要增加方法?
完全不改原来的类是不可能增加新方法的,我们要想办法开一个“小口”,通过这个“小口”来实现灵活增加它的功能。
访问者模式就是通过这个“小口”来访问原类,从而增强原类的功能。
应用了访问者模式的 类图 如下:
说明:
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大战需求分析》作者