我有一个包含基类和几个扩展类的类结构。我想在每个类上执行多个“操作”,具体取决于它们的类型-这就是为什么我要使用访客模式。在类本身上实现动作需要一些依赖关系,我希望避免依赖于事件类。
这是我要移至访问者模式的当前类结构的简化:
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);
而不是注释行来解决。但这必须添加到所有访问者的每个访问函数中。。。。。
除了访客模式以外,还有其他设计模式可以使我做到这一点吗?
答案 0 :(得分:0)
要在类本身上实现操作,需要一些依赖关系,我希望避免将它们推到事件类上。
我将围绕您不希望Event类知道的依赖项创建接口,并使Event类依赖于您的(轻量级)接口。与访问者模式相比,依赖注入是减少耦合的一种简单明了的方法。并为您提供了将来轻松扩展事件层次结构的自由。
请记住,通过将它们包装在传达域含义和适当抽象级别的接口中,可以使Event依赖项看起来像您想要的那样。或者,如果您想向现有的依赖项中添加一些行为,请考虑使用装饰器模式。