Visitor模式和Decorator模式提供了无需更改现有类层次结构的情况下向其中增加新方法。
Visitor模式应用场景:如果一个应用程序存在有需要以多种不同方式进行解释的数据结构,就可以使用Visitor模式。
示例:
解决问题: 在Modern接口中增加ConfigureForUnix方法,ConfigureForWin方法或者其他平台的方法。
Visitor 模式如同一个矩阵,图1例子中,矩阵的一条轴是不同类型的调制解调器,另一条轴是不同类型的操作系统。该矩阵的每一个单元都被一项功能填充,该功能描绘了如何把特定的调制解调器初始化为可以在特定操作系统中使用。
图1 Visitor 模式
Acyclic Visitor 模式如同一个稀疏的矩阵,访问者不需要针对每一个被访问的派生类都实现visit函数。例如,如果Erniet调制解调器不可以配置在UNIX中,那么UnixModernConfigurator都不会实现ErnieVisitor接口。
图2
Decorator模式:
图3 Decorator 模式
例子:
1)android 中的Decorator模式:
从图中可以看出,Activity继承了ContextWrapper类,而在ContextWrapper类中,实现了startService函数。在ContextWrapper类中,有一个成员变量mBase,它是一个ContextImpl实例,而ContextImpl类和ContextWrapper类一样继承于Context类,ContextWrapper类的startService函数最终过调用ContextImpl类的startService函数来实现。这种类设计方法在设计模式里面,就称之为装饰模式(Decorator),或者包装模式(Wrapper)。