访问者方式(Visitor)
访问者模式(Visitor)
GOF定义:表示一个作用于某对象结构中的各元素的操作用,它是你可以在不改变各元素的前提下定义作用于这些元素的新操作。
访问者模式是21中设计模式中最难理解的一个设计模式。
角色分析:
抽象访问者:
抽象类或者接口,声明访问者可以访问哪些元素,具体的程序中就是visit方法中的参数定义。
访问者:
实现抽象访问者所声明的方法,及访问元素的后做的操作。
抽象元素类:
接口或者抽象类,声明接受哪一类访问者访问,程序中定义accept方法的参数定义。
元素类:实现抽象元素类所声明的accept方法,及一般的class.。基本实现:visitor.visit(this);
具体例子实现:
/** * 抽象访问者角色 * @author wdt * */ interface IVisitor { public void visit(Element1 el1); public void visit(ConcreteElement2 el2); } /** * * @author wdt * 具体访问者角色 * 实现抽象访问者的方法 */ class Visitor implements IVisitor { /** * el1为被访问的对象 */ public void visit(ConcreteElement1 el1) { ---这里还可以做点什么? el1.doSomething(); } public void visit(ConcreteElement2 el2) { el2.doSomething(); } }
/** * 抽象访问者角色 * @author wdt * */ interface IVisitor { public void visit(ConcreteElement1 el1); public void visit(ConcreteElement2 el2); } /** * 具体元素对象 实现抽象元素对象的方法 * @author wdt * */ class ConcreteElement1 extends Element { public void doSomething(){ System.out.println("这是元素1"); } public void accept(IVisitor visitor) { visitor.visit(this); } } class ConcreteElement2 extends Element { public void doSomething(){ System.out.println("这是元素2"); } public void accept(IVisitor visitor) { visitor.visit(this); } }
public class Client { public static void main(String[] args){ List<Element> list = new ArrayList<Element>(); list.add(new ConcreteElement1()); list.add(new ConcreteElement2()); for(Element e: list){ e.accept(new Visitor()); //接见访问者 } } }
使用场景:
1、一些对象关系比较弱的行为,可以使用访问者模式,将这些弱关系行为放在访问者中。