无废话C#设计模式之二十一:Visitor
2009-04-02 08:22:55 来源:WEB开发网l 这个例子中的StopGameVisitor体现了访问者模式最主要的作用,那就是为元素增加新的操作。这得益于访问者统一Accept接口以及双重分派的机制。可以从代码中以B打头的数字看出关闭服务的整个流程。
l 由于本例中把Visitor的接口按照功能分成了小接口,并且还有一个抽象顶层的空接口。这样,我们就可以为具体访问者实现需要的接口,并且为层次中增加元素也变得不是那么困难。从QueryPlayerCountVisitor中可以看到,具体访问者可以某些元素的新操作,而无需实现所有元素的新操作。
l 访问者模式还有一个应用是使不同类型元素组成的集合的遍历访问变得简单、符合开闭原则。由于GameServer的子元素一般只有GameService而不会有GameService和GameAgent,所以本例没有体现这样的应用。
l 访问者模式的结构比较复杂,变化也比较多。一般不管怎么样变化,主要还是依靠访问者模式双重分派和统一的Accept接口来实现。访问者模式的效果有的时候也类似适配器、装饰模式等,由于往往用于操作集合所以一般也通常会和迭代器、组合模式一起使用。
何时采用
访问者模式适用下面的情况:
l 对象结构中包含很多类型,这些类型没有统一的接口,而我们又希望使得对象的操作进行统一。
l 希望为对象结构中的类型新增操作,并且不希望改变原有的代码。
l 对象结构中的一些类型之间发生耦合,而它们的实现又经常会发生变动。
l 针对结构中同一层次的不同类型甚至是不同层次的类型进行迭代。
从这里可以看出,访问者模式的主要适用还是针对对象结构(往往有层次关系),并且需要在设计的时候实现为各类型预留接受访问者的接口。
更多精彩
赞助商链接