访问者设计模式是最难的设计模式.
Object Structure:公园
Element:是一个抽象,可以是一个接口或者是抽象类.是公园的每一个部分的抽象.
Concrete Element:实际的元素角色.公园的A部分或者是公园的B部分.accept()接待人.
Visitor:抽象的访问者.
Concrete Visitor:清洁工A或者是清洁工B.visit()访问.
对象角色结构Object Structure:Park
Element:ParkElement.公园的每一部分的抽象.
ConcreteElement:ParkA和ParkB.
访问者:Visitor
访问者的具体实现:清洁工AVisitor和清洁工BVisitorB.
Park是用来接收访问者的,它里面没有任何输出的,是没有任何方法的实现的.
输出是由访问者实现的,访问者是如何实现的就看它里面的visit()方法是如何实现的.
public void visit(Park park) {//除了是结合你的不同的重载方法以外,还可以获得park的数据.
public class MainClass { public static void main(String[] args) { Park park = new Park(); park.setName("越秀公园"); //清洁工A VisitorA visitorA = new VisitorA(); park.accept(visitorA); //清洁工B VisitorB visitorB = new VisitorB(); park.accept(visitorB); VisitorManager visitorManager = new VisitorManager(); park.accept(visitorManager); } }
public class Park implements ParkElement { private ParkA parkA; private ParkB parkB; private String name;//假设公园是有名字的. public Park() { super(); // TODO Auto-generated constructor stub this.parkA = new ParkA(); this.parkB = new ParkB(); parkA.setName("A"); parkB.setName("B"); } @Override public void accept(Visitor visitor) { // TODO Auto-generated method stub visitor.visit(this);//把Park传入进去 parkA.accept(visitor); parkB.accept(visitor); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
/* * 公园的A部分 */ public class ParkA implements ParkElement { private String name; @Override public void accept(Visitor visitor) { // TODO Auto-generated method stub visitor.visit(this);//把ParkA传进去 } public String getName() { return name; } public void setName(String name) { this.name = name; } }
/* * 公园的B部分 * */ public class ParkB implements ParkElement{ private String name; @Override public void accept(Visitor visitor) { // TODO Auto-generated method stub visitor.visit(this);//把ParkB传进去 } public String getName() { return name; } public void setName(String name) { this.name = name; } }
/* * 公园每一部分的抽象 * */ public interface ParkElement { //用来接纳访问者 public void accept(Visitor visitor); }
/* * * 访问者 */ public interface Visitor { public void visit(Park park); public void visit(ParkA parkA); public void visit(ParkB parkB); }
/* * 清洁工A,服务parkA的卫生情况 * 清洁工A,负责parkA的卫生情况 */ public class VisitorA implements Visitor { @Override public void visit(Park park) { // TODO Auto-generated method stub } @Override public void visit(ParkA parkA) { // TODO Auto-generated method stub System.out.println("清洁工A:完成公园"+parkA.getName()+"的卫生"); } @Override public void visit(ParkB parkB) { // TODO Auto-generated method stub } }
/* * 清洁工B,负责公园B部分的卫生 * */ public class VisitorB implements Visitor{ @Override public void visit(Park park) { // TODO Auto-generated method stub } @Override public void visit(ParkA parkA) { // TODO Auto-generated method stub } @Override public void visit(ParkB parkB) { // TODO Auto-generated method stub //System.out.println("清洁工B:完成公园B的卫生"); System.out.println("清洁工B:完成公园" + parkB.getName()+"的卫生"); } }
public class VisitorManager implements Visitor{ @Override public void visit(Park park) {//除了是结合你的不同的重载方法以外,还可以获得park的数据. // TODO Auto-generated method stub //System.out.println("管理员:负责公园卫生检查"); System.out.println("管理员:负责"+park.getName()+"卫生检查"); } @Override public void visit(ParkA parkA) { // TODO Auto-generated method stub System.out.println("管理员:负责公园"+parkA.getName()+"部分卫生检查"); } @Override public void visit(ParkB parkB) { // TODO Auto-generated method stub System.out.println("管理员:负责公园"+parkB.getName()+"部分卫生检查"); } }