访问者模式-Visitor
对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同。在这种场景下就可以使用访问者模式了.
对于本文中的一组对象Archer(弓箭手) Rider(骑兵) Gunner(火枪手) 这一组对象, 由不同的访问者(AttackVisitor 和 RetreatVisitor)访问, 产生的结果会不同. 一种是进攻, 一种是撤退。
被作用对象
Soldier接口
public interface Soldier {
void accept(Visitor v);
}
Archer类
public class Archer implements Soldier {
@Override
public void accept(Visitor v) {
v.visit(this);
}
public String getArcher() {
return "Archer";
}
}
Gunner类
public class Gunner implements Soldier {
@Override
public void accept(Visitor v) {
v.visit(this);
}
public String getGunner() {
return "Gunner";
}
}
Rider类
public class Rider implements Soldier {
@Override
public void accept(Visitor v) {
v.visit(this);
}
public String getRider() {
return "Rider";
}
}
访问者
Visitor接口
public interface Visitor {
void visit(Gunner gunner);
void visit(Rider rider);
void visit(Archer archer);
}
AttackVisitor类
public class AttackVisitor implements Visitor {
@Override
public void visit(Gunner gunner) {
System.out.println(gunner.getGunner() + " 发起进攻");
}
@Override
public void visit(Rider rider) {
System.out.println(rider.getRider() + " 发起进攻");
}
@Override
public void visit(Archer archer) {
System.out.println(archer.getArcher() + " 发起进攻");
}
}
RetreatVisitor类
public class RetreatVisitor implements Visitor {
@Override
public void visit(Gunner gunner) {
System.out.println(gunner.getGunner() + " 开始撤退");
}
@Override
public void visit(Rider rider) {
System.out.println(rider.getRider() + " 开始撤退");
}
@Override
public void visit(Archer archer) {
System.out.println(archer.getArcher() + " 开始撤退");
}
}
Main
运行调试
public class Main {
public static void main(String[] args) {
Soldier[] list = {new Gunner(), new Rider(), new Archer()};
RetreatVisitor retreat = new RetreatVisitor();
AttackVisitor attack = new AttackVisitor();
for (Soldier element : list) {
element.accept(attack);
}
System.out.println();
for (Soldier element : list) {
element.accept(retreat);
}
}
}
结果如下: