访问者模式解决方案:访问者访问次数相同,但应使用不同的对象 [英] Visitor Pattern solution: few visitors have same interface but should work with different objects

查看:180
本文介绍了访问者模式解决方案:访问者访问次数相同,但应使用不同的对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下类图(访问者模式实现):

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆