访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
package visitor;
/**
* 访问者模式(Visitor)
* "状态"的抽象类
*/
public abstract class Action {
// 得到男人结论或反应
public abstract void getManConclusion(Man concreteElementA);
// 得到女人结论或反应
public abstract void getWomanConclusion(Woman concreteElementB);
}
package visitor;
/**
* 访问者模式(Visitor)
* "人"的抽象类
*/
public abstract class Person {
// 接受
public abstract void accept(Action visitor);
}
package visitor;
/**
* 访问者模式(Visitor)
* "男人"类
*/
public class Man extends Person {
@Override
public void accept(Action visitor) {
visitor.getManConclusion(this);
}
}
package visitor;
/**
* 访问者模式(Visitor)
* "女人"类
*/
public class Woman extends Person {
@Override
public void accept(Action visitor) {
visitor.getWomanConclusion(this);
}
}
package visitor;
/**
* 访问者模式(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()
+ "时,背后大多有一个不成功的男人。");
}
}
package visitor;
/**
* 访问者模式(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()
+ "时,眼泪汪汪,谁也劝不了。");
}
}
package visitor;
/**
* 访问者模式(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()
+ "时,遇事懂也装作不懂。");
}
}
package visitor;
/**
* 访问者模式(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()
+ "时,欣慰曰:爱情长跑路漫漫,婚姻保险保平安。");
}
}
package visitor;
import java.util.ArrayList;
import java.util.List;
/**
* 访问者模式(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);
}
}
}
package 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);
}
}