访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式适用于数据结构相对稳定的系统。如果一个系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式比较合适。【互相组合】
/**
* 为该对象结构中ConcreteElement的每一个类声明一个Visit操作
*
* @author administrator
*
*/
public abstract class Visitor {
public abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}
class ConcreteVisitor1 extends Visitor {
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName() + "被"
+ this.getClass().getSimpleName() + "访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName() + "被"
+ this.getClass().getSimpleName() + "访问");
}
}
class ConcreteVisitor2 extends Visitor {
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName() + "被"
+ this.getClass().getSimpleName() + "访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName() + "被"
+ this.getClass().getSimpleName() + "访问");
}
}
/**
* 定义一个accept操作,它以一个访问者为参数
*
* @author administrator
*
*/
public abstract class Element {
public abstract void accept(Visitor visitor);
}
class ConcreteElementA extends Element {
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
}
class ConcreteElementB extends Element {
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementB(this);
}
}
/**
* 提供一个高层的接口以允许访问者访问它的元素
*
* @author administrator
*
*/
public class ObjectStructure {
private List<Element> elements = new ArrayList<Element>();
public void attach(Element element) {
elements.add(element);
}
public void detach(Element element) {
elements.remove(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
/**
* 客户端
*
* @author administrator
*
*/
public class VisitorClient {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure();
o.attach(new ConcreteElementA());
o.attach(new ConcreteElementB());
ConcreteVisitor1 visitor1 = new ConcreteVisitor1();
ConcreteVisitor2 visitor2 = new ConcreteVisitor2();
o.accept(visitor1);
o.accept(visitor2);
}
}
案例
/**
* 访问者模式(Visitor)
* "人"的抽象类
*/
public abstract class Person {
// 接受
public abstract void accept(Action visitor);
}
/**
* 访问者模式(Visitor)
* "男人"类
*/
public class Man extends Person {
@Override
public void accept(Action visitor) {
visitor.getManConclusion(this);
}
}
/**
* 访问者模式(Visitor)
* "女人"类
*/
public class Woman extends Person {
@Override
public void accept(Action visitor) {
visitor.getWomanConclusion(this);
}
}
/**
* 访问者模式(Visitor)
* "状态"的抽象类
*/
public abstract class Action {
// 得到男人结论或反应
public abstract void getManConclusion(Man concreteElementA);
// 得到女人结论或反应
public abstract void getWomanConclusion(Woman concreteElementB);
}
/**
* 访问者模式(Visitor)
* 具体"状态"类:恋爱
*/
public class Amativeness extends Action {
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName() + this.getClass().getSimpleName()
+ "时,凡事不懂也要装懂。");
}
@Override
public void getWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName() + this.getClass().getSimpleName()
+ "时,遇事懂也装作不懂。");
}
}
/**
* 访问者模式(Visitor)
* 具体"状态"类:失败
*/
public class Failing extends Action {
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName() + this.getClass().getSimpleName()
+ "时,闷头喝酒,谁也不用劝。");
}
@Override
public void getWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName() + this.getClass().getSimpleName()
+ "时,眼泪汪汪,谁也劝不了。");
}
}
/**
* 访问者模式(Visitor)
* 具体"状态"类:结婚
*/
public class Marriage extends Action {
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName() + this.getClass().getSimpleName()
+ "时,感慨道:恋爱游戏终结时,'有妻徒刑'遥无期。");
}
@Override
public void getWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName() + this.getClass().getSimpleName()
+ "时,欣慰曰:爱情长跑路漫漫,婚姻保险保平安。");
}
}
/**
* 访问者模式(Visitor)
* 具体"状态"类:成功
*/
public class Success extends Action {
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName() + this.getClass().getSimpleName()
+ "时,背后多半有一个伟大的女人。");
}
@Override
public void getWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName() + this.getClass().getSimpleName()
+ "时,背后大多有一个不成功的男人。");
}
}
/**
* 访问者模式(Visitor)
* 对象结构
*/
public class ObjectStructure {
private List<Person> elements = new ArrayList<>();
// 增加
public void attach(Person element) {
elements.add(element);
}
// 移除
public void detach(Person element) {
elements.remove(element);
}
// 查看显示
public void display(Action visitor) {
for (Person e : elements) {
e.accept(visitor);
}
}
}
/**
* 访问者模式(Visitor)
* 客户端main方法
*/
public class Client {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure();
o.attach(new Man());
o.attach(new Woman());
// 成功时的反应
Success v1 = new Success();
o.display(v1);
// 失败时的反应
Failing v2 = new Failing();
o.display(v2);
// 恋爱时的反应
Amativeness v3 = new Amativeness();
o.display(v3);
// 结婚时的反应
Marriage v4 = new Marriage();
o.display(v4);
}
}