具有多个访问实现的访客模式

时间:2016-06-07 20:05:45

标签: java design-patterns

我需要对Composition模式进行各种操作。我用复合模式来管理访客模式的这些实现。

接口:

public interface Visitor {
    void visit(DayPart dayPart);
    void visit(DayParting dayParting);
    void visit(TimePart timePart);
}

复合类中的访问者方法:

public void accept(Visitor visitor) {
        visitor.visit(this);
        Iterator<AbstractComposite> itr = iterator();
        Parting children;
        while (itr.hasNext()) {
            children = (Parting) itr.next();
            children.accept(visitor);
        }
    }

叶子上的访客方法:

@Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

访客类实现:

public class myVisitor implements Visitor {
    @Override
    public void visit(DayPart dayPart) {
        //do something (or not)
    }

    @Override
    public void visit(DayParting dayParting){
        // do something (or not)
    }

    @Override
    public void visit(TimePart timePart){
        //do something (or not)
    }
}

问题在于我需要对作文进行各种操作,并且通过这种设计,我需要为每次“访问”我需要做的一个新课程,这是非常不切实际的。

所以,我正在考虑用内部类做这样的事情(我把通用名称)。

public abstract class VisitorImpl implements Visitor {
    //Hook methods
    @Override
    public void visit(Composite composite) {
        //hok method
    }

    @Override
    public void visit(Composite2  composite2) {
        //hook method
    }

    @Override
    public void visit(Leaf leaf) {
        //hook method
    }

    public static Visitor ParticularVisitor(){
        return new ParticularVisitor();
    }
    private static class ParticularVisitor extends VisitorImpl {
        @Override
        public void visit(Composite composite) {
            //do something real.
        }
        @Override
        public void visit(Composite2 composite2) {
            //do something real.
        }

        @Override
        public void visit(Leaf leaf) {
            //do something real.
        }
    }
    private static class ParticularVisitor_2 extends VisitorImpl {
        public ParticularVisitor_2(){
        }
        @Override
        public void visit(Leaf leaf){
            //Just do something with this
        }
    }
}

这是解决我问题的好方法吗?有什么改进吗?

1 个答案:

答案 0 :(得分:4)

  

访客设计模式

     

意图

     
      
  • 表示要对对象结构的元素执行的操作。
  •   
  • 访问者允许您定义新操作,而无需更改其操作元素的类。
  •   
  • 恢复丢失类型信息的经典技巧。
  •   
  • 根据两个对象的类型做正确的事。
  •   
  • 双重发送
  •   
     

问题

     

需要在节点上执行许多不同且不相关的操作   异构聚合结构中的对象。你想避免   &#34;污染&#34;具有这些操作的节点类。而且,你不想要   必须查询每个节点的类型并将指针强制转换为正确的   在执行所需操作之前键入。

来自:Sourcemaking

所以,你的问题&#34;

  

&#34;问题是我需要对作文进行各种操作   通过这种设计,我需要为每次访问&#34;做一个新的课程。我是什么   需要这样做,这是非常不切实际的。&#34;

不是一个问题,访问者应该如何工作。

One operation to be performed = one visitor

如果您的操作之间没有任何关系,那么您可以使用访问者做到最好。