访客模式-在上课之前先拜访高级班

时间:2019-08-22 09:02:53

标签: java oop design-patterns visitor-pattern

我有一个包含基类和几个扩展类的类结构。我想在每个类上执行多个“操作”,具体取决于它们的类型-这就是为什么我要使用访客模式。在类本身上实现动作需要一些依赖关系,我希望避免依赖于事件类。

这是我要移至访问者模式的当前类结构的简化:

class BaseEvent{

    public BaseEvent(SomeDependency d){...}
    String baseAttrA;

    public void doActionA(){
       d.doSomeAction(baseAttrA);
    }
}


class EventA extends BaseEvent{
      String eventAAttribute;
      public EventA(SomeOtherDependency d){...}    
      public void doActionA(){ 
        super.doActionA();
        d.doOtherAction(eventAAttribute);
      }    

}

我还有几个扩展BaseEvent的类和其他一些动作。
请注意:
EventA(及其后续)操作要求对基本事件执行相同的操作。
对BaseEvent / EventA / other的相同操作需要不同的依赖关系和属性。在同一场景中调用的是不同的逻辑。

最理想的情况是,我想为每个操作(使用访问者模式)提供一个类,该类接收操作所需的特定依赖关系,并将所有逻辑包含在一个类中。像

public class ActionAVisitor{
     public ActionAVisitor(SomeDependency d1, SomeOtherDependency d2){...}

   public void visit(BaseEvent event){
       d1.doSomeAction(event.getBaseAttribute());  
  }

  public void visit(EventA event){
      // Missing call to super.doActionA()
      d2.doDifferentAction(event.getEventAAttribute());
  }

问题在于,现在没有对super.doActionA()的调用,可以通过调用难看的this.visit((BaseEvent)event);而不是注释行来解决。但这必须添加到所有访问者的每个访问函数中。。。。。

除了访客模式以外,还有其他设计模式可以使我做到这一点吗?

1 个答案:

答案 0 :(得分:0)

  

要在类本身上实现操作,需要一些依赖关系,我希望避免将它们推到事件类上。

我将围绕您不希望Event类知道的依赖项创建接口,并使Event类依赖于您的(轻量级)接口。与访问者模式相比,依赖注入是减少耦合的一种简单明了的方法。并为您提供了将来轻松扩展事件层次结构的自由。

请记住,通过将它们包装在传达域含义和适当抽象级别的接口中,可以使Event依赖项看起来像您想要的那样。或者,如果您想向现有的依赖项中添加一些行为,请考虑使用装饰器模式。