1.1.1 描述
l 正规描述
访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。
l 形象描述
情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了。
1.1.2 类图&示意代码
public interface Visitor(){ void visit1(Visitable visitElement); void visit2(Visitable visitElement); }
public class ConcreteVisitor implements Visitor(){ public void visit1(Visitable visitElement){ visitElement.Operation1(); }
public void visit2(Visitable visitElement){ visitElement.Operation2(); } }
public interface Visitable(){ void accept1(Visitor visitor); void accept2(Visitor visitor); void Operation1(); void Operation2(); }
public class ConcreteElement1 implements Visitable(){ public void accept1(Visitor visitor){ visitor.visit1(this); }
public void accept2(Visitor visitor){ visitor.visit2(this); }
public void Operation1(){ //to do }
public void Operation2(){ //to do } }
public class ConcreteElement2 implements Visitable(){ public void accept1(Visitor visitor){ visitor.visit1(this); }
public void accept2(Visitor visitor){ visitor.visit2(this); }
public void Operation1(){ //to do }
public void Operation2(){ //to do } }
public class Client(){ public void main(String args[]){ Visitor visitor = new ConcreteVisitor(); Vector<Visitable> visitableElements = new Vector(); visitableElements.add(new ConcreteElement1()); visitableElements.add(new ConcreteElement2());
for(Enumeration e = visitableElements.elements();e.hasMoreElements()){ visitableElement = (Visitable)e.nextElement(); visitableElement.accept1(visitor); }
for(Enumeration e = visitableElements.elements();e.hasMoreElements()){ visitableElement = (Visitable)e.nextElement(); visitableElement.accept2(visitor); } } } |