访问者模式比较复杂,菜鸟教程上说主要是将数据结构与数据操作分离,我也看得不是很懂,书中的例子主要是client调用具体的Person,然后Person再找具体的Action。
我把书中只有方法的抽象类都改成了interface
UML
代码结构
public interface Action {
public abstract void getManConclusion(Man concreteElementA);
public abstract void getWomanConclusion(Woman concreteElementB);
}
public class Amativeness implements 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()
+ "时,遇事懂也装作不懂。");
}
}
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);
}
}
public class Failing implements 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()
+ "眼泪汪汪,谁也劝不了。");
}
}
public class Man implements Person {
@Override
public void accept(Action visitor) {
visitor.getManConclusion(this);
}
}
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);
}
}
}
public interface Person {
public void accept(Action visitor);
}
public class Success implements 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()
+ "时,背后大多有一个不成功的男。");
}
}
public class Woman implements Person {
@Override
public void accept(Action visitor) {
visitor.getWomanConclusion(this);
}
}
运行结果