設計得很巧妙,但是不知道什么時候用。因為同樣的需求,可以用多態很容易地實現。
舉例:
用多態實現一個需求的代碼:
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時,只需要增加或者刪除即可。