設(shè)計(jì)得很巧妙,但是不知道什么時(shí)候用。因?yàn)橥瑯拥男枨?,可以用多態(tài)很容易地實(shí)現(xiàn)。
舉例:
用多態(tài)實(shí)現(xiàn)一個(gè)需求的代碼:
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模式實(shí)現(xiàn)的代碼
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的好處是,當(dāng)需要改變其中一項(xiàng)業(yè)務(wù)(即Node)的處理時(shí),不需要每個(gè)地方都進(jìn)行修改,而只需要改動(dòng)Visitor類(lèi)中相應(yīng)的處理函數(shù)就可以了。也就是說(shuō)它適合于業(yè)務(wù)處理時(shí)常發(fā)生變動(dòng)的情況。
當(dāng)然,Visitor也有它自身的限制。它不適合于業(yè)務(wù)數(shù)量的經(jīng)常變化,因?yàn)橐坏┬略龌騽h除一些Node時(shí),需要對(duì)visitor進(jìn)行相應(yīng)的增刪。也就是說(shuō)具體Node與Visitor是耦合的。此時(shí)可以用多態(tài),因?yàn)樵黾踊蛘邉h除一些Node時(shí),只需要增加或者刪除即可。