无废话C#设计模式之二十一:Visitor
2009-04-02 08:22:55 来源:WEB开发网代码执行结果如下图:
代码说明
代码从组合模式的例子修改过来,有一点乱,一点一点来分析:
l IVisitor是一个空接口,目的是为了抽象所有的访问者,抽象层次相当于Element。
l IGameServerVisitor、IGameServiceVisitor以及IGameAreaVisitor定义了访问者的访问操作(操作接口)。在这里,我们并没有把它们合并为一个接口,因为访问者可能仅针对一部分元素,或一个层次的元素,不一定都针对所有元素。
l StartGameVisitor、StopGameVisitor以及QueryPlayCountVisitor是具体的访问者。它们根据自己的需求实现不同的操作接口,虽然都是访问者但是它们的目的不太一样,见下。
l Element类型就是抽象构件(抽象元素),它给组合对象以及单个对象提供了一个一致的接口,使得它们都能有一致的行为。唯一和组合模式不同的是,在这里定义了一个接受访问者的接口。
l GameService、GameServer以及GameArea都是具体的元素。从组合角度来看,GameServer和GameArea是树枝,GameService是树叶。看一下Accept()方法,对于具体元素来说,它应该明确接受特定层次的访问者,如果类型转换正确的话,那么调用访问者的访问方法。
l 这个例子中的StartGameVisitor的目的是统一元素的接口。注意到GameService、GameServer以及GameArea中开启服务的方法都不同(并没有实现统一的接口),这样的话,高层的元素需要直接耦合低层元素的某个方法。通过访问者,我们使得它们直接和访问者的统一方法耦合,由访问者再适配不同的方法。可以从代码中以A打头的数字看出开启服务的整个流程。
更多精彩
赞助商链接