访问者模式可以在不同的操作时不需要修改原来的接口
/**
* Created by gmy on 2017/10/20.
*/
public class App {
public static void main(String[] args) {
Commander commander =
new Commander(new Sergeant(new Soldier(), new Soldier(), new Soldier()), new Sergeant(
new Soldier(), new Soldier(), new Soldier()));
commander.accept(new SoldierVisitor());
commander.accept(new SergeantVisitor());
commander.accept(new CommanderVisitor());
}
}
public class Commander extends Unit {
public Commander(Unit...children){
super(children);
}
@Override
public void accept(UnitVisitor visitor) {
visitor.visitCommander(this);
super.accept(visitor);
}
@Override
public String toString() {
return "commander";
}
}
public class CommanderVisitor implements UnitVisitor {
@Override
public void visitSoldier(Soldier soldier) {
}
@Override
public void visitSergeant(Sergeant sergeant) {
}
@Override
public void visitCommander(Commander commander) {
System.out.println("Good to see you "+ commander);
}
}
public class Sergeant extends Unit {
public Sergeant(Unit...children){
super(children);
}
@Override
public void accept(UnitVisitor visitor) {
visitor.visitSergeant(this);
super.accept(visitor);
}
@Override
public String toString() {
return "sergeant";
}
}
public class SergeantVisitor implements UnitVisitor {
@Override
public void visitSoldier(Soldier soldier) {
}
@Override
public void visitSergeant(Sergeant sergeant) {
System.out.println("Hello "+sergeant);
}
@Override
public void visitCommander(Commander commander) {
}
}
public class Soldier extends Unit {
public Soldier(Unit...children){
super(children);
}
@Override
public void accept(UnitVisitor visitor) {
visitor.visitSoldier(this);
super.accept(visitor);
}
@Override
public String toString() {
return "soldier";
}
}
public class SoldierVisitor implements UnitVisitor {
@Override
public void visitSoldier(Soldier soldier) {
System.out.println("Greetings "+ soldier);
}
@Override
public void visitSergeant(Sergeant sergeant) {
}
@Override
public void visitCommander(Commander commander) {
}
}
public abstract class Unit {
private Unit[] children;
public Unit(Unit...children){
this.children=children;
}
public void accept(UnitVisitor visitor){
for (Unit child:children){
child.accept(visitor);
}
}
}
public interface UnitVisitor {
void visitSoldier(Soldier soldier);
void visitSergeant(Sergeant sergeant);
void visitCommander(Commander commander);
}
讲解:
1 …参数可以实现参数可变