设计模式之访问者模式(visitor)

  • 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。
  • 具体访问者角色(ServiceVisitor):实现每个由访问者角色(Visitor)声明的操作。
  • (Element):定义一个Accept操作,它以一个访问者为参数。
  • 具体元素角色(StudentElement):实现由元素角色提供的Accept操作。
  • 对象结构角色(Subject):

Java 访问者模式 示例

// 定义访问者的行为, 所有的行为都在这里添加,然后由子类去实现
public interface Visitor {
	public void doStudentHandler(StudentElement ec);
}
// 元素角色
public abstract class Element {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public abstract void accept(Visitor visitor);
}

public class StudentElement extends Element {
	public void accept(Visitor visitor) {
		visitor.doStudentHandler(this);
	}
}

// 访问者行为具体实现类
public class ServiceVisitor implements Visitor {
	@Override
	public void doStudentHandler(StudentElement ec) {
		LogHelper.log(ec.getName() + " 学生提出服务请求");
	}
}

public class Subject {
	private List<Element> col = new ArrayList<Element>();
	public void handleRequest(Visitor visitor) {
		for (Element cm : col) {
			cm.accept(visitor);
		}
	}
	public void addElement(Element ele) {
		this.col.add(ele);
	}
	public static void main(String[] args) {
		Subject os = new Subject();

		Element cml = new StudentElement();
		cml.setName("张三");
		os.addElement(cml);

		ServiceVisitor serviceVisitor = new ServiceVisitor();
		os.handleRequest(serviceVisitor);
	}
}

访问者模式理解起来有点难度,所以建议大家自己先敲一遍代码!然后对着代码入口