设计得很巧妙,但是不知道什么时候用。因为同样的需求,可以用多态很容易地实现。
举例:
用多态实现一个需求的代码:
interface node
{
void process();
}
class NodeA implements node
{
public void process()
{
System.out.println("NodeA processed");
}
}
class NodeB implements node
{
public void process()
{
System.out.println("NodeB processed");
}
}
class Visit
{
public void visit(node n)
{
n.process();
}
}
public class Main
{
public static void main(String[] args)
{
Visit v=new Visit();
v.visit(new NodeA());
v.visit(new NodeB());
}
}
用visitor模式实现的代码
abstract class Node
{
abstract void process();
public void accept(Visitor visitor)
{
visitor.visit(this);
}
}
class NodeA implements Node
{
public void process()
{
System.out.println("NodeA processed");
}
}
class NodeB implements Node
{
public void process()
{
System.out.println("NodeB processed");
}
}
interface Visit
{
void visit(NodeA node);
void visit(NodeB node);
}
class VisitA implements Visit
{
public void visit(NodeA node)
{
node.process();
}
public void visit(NodeB node)
{
node.process();
}
}
class VisitB implements Visit
{
public void visit(NodeA node)
{
node.process();
}
public void visit(NodeB node)
{
node.process();
}
}
public class Main
{
public static void main(String[] args)
{
VisitA v=new VisitA();
nodea=new NodeA();
nodeb=new NodeB();
nodea.accept(v);
nodeb.accept(v);
}
}
采用Visitor的好处是,当需要改变其中一项业务(即Node)的处理时,不需要每个地方都进行修改,而只需要改动Visitor类中相应的处理函数就可以了。也就是说它适合于业务处理时常发生变动的情况。
当然,Visitor也有它自身的限制。它不适合于业务数量的经常变化,因为一旦新增或删除一些Node时,需要对visitor进行相应的增删。也就是说具体Node与Visitor是耦合的。此时可以用多态,因为增加或者删除一些Node时,只需要增加或者删除即可。