访问者模式解决方案:访问者访问次数相同,但应使用不同的对象 [英] Visitor Pattern solution: few visitors have same interface but should work with different objects
问题描述
我有以下类图(访问者模式实现):
I have following class diagram (visitor pattern implementation):
http://i.stack.imgur.com/EO0Yz.jpg
预期结果:
1)WiredVisitor应该只访问路由器和WiredNetworkCard
2)WirelessVisitor应该只访问路由器和WirelessNetworkCard
Expected result:
1) WiredVisitor should visit only Router and WiredNetworkCard
2) WirelessVisitor should visit only Router and WirelessNetworkCard
所以,我的问题是:如何更改设计(或代码)以达到预期的结果?
PS我目前的解决方案是在两个访问者的每次访问(卡:INNETCARD)方法中添加以下代码:
// in WiredVisitor
if (card.getClass.equals(WiredNetworkCard.class)){
// do logic of visit method
}
// in WirelessVisitor
if (card.getClass.equals(WirelessNetworkCard.class)){
// do logic of visit method
}
推荐答案
根据非循环访问者模式,将您的访问者分成具体的子类。请注意,您仍然需要进行类型检查,但它包含在正在访问的类型中:
In the spirit of the acyclic visitor pattern, separate your visitors into subclass specific ones. Note that you'll still need the type check, but it's contained to the type being visited:
以下是访问者界面:
interface IVisitor {
}
interface IRouterVisitor extends IVisitor {
void visit(Router router);
}
interface INetworkCardVisitor extends IVisitor {
}
interface IWirelessNetworkCardVisitor extends INetworkCardVisitor {
void visit(WirelessNetworkCard card);
}
interface IWiredNetworkCardVisitor extends INetworkCardVisitor {
void visit(WiredNetworkCard card);
}
具体访问者将如下所示:
The concrete visitors will look like this:
class WiredVisitor implements IWiredNetworkCardVisitor, IRouterVisitor {
// ...
}
class WirelessVisitor implements IWirelessNetworkCardVisitor, IRouterVisitor {
// ...
}
访问对象:
interface INetworkElement {
void accept(IVisitor visitor);
}
class Router implements INetworkElement {
@Override
public void accept(IVisitor visitor) {
if (visitor instanceof IRouterVisitor) {
((IRouterVisitor)visitor).visit(this);
}
}
}
interface INetworkCard extends INetworkElement {}
class WiredNetworkCard implements INetworkCard {
@Override
public void accept(IVisitor visitor) {
if (visitor instanceof IWiredNetworkCardVisitor) {
((IWiredNetworkCardVisitor)visitor).visit(this);
}
}
}
class WirelessNetworkCard implements INetworkCard {
@Override
public void accept(IVisitor visitor) {
if (visitor instanceof IWirelessNetworkCardVisitor) {
((IWirelessNetworkCardVisitor)visitor).visit(this);
}
}
}
在这些类型支票中,你如果类型不是预期的,也可能会发生错误,具体取决于您想要发生的情况。
In those type checks, you can also throw an error if the type is not the expected one, depending on what you'd like to happen in that case.
这篇关于访问者模式解决方案:访问者访问次数相同,但应使用不同的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!