定义
被访问对象放开胸怀,接受不同的访问者进行访问,且访问者对被访者数据进行处理。
结构图
角色与理解
- 访问者模式共分为五种角色:
-
- Visitor(抽象访问者):内部声明一个对每一个具体元素进行访问的操作。
- Concrete Visitor(具体访问者):继承抽象访问者,实现对所有具体元素的一种访问操作。
- Element(抽象元素):声明accept()方法,以抽象访问者作为参数,供访问者访问。
- Concrete Element(具体元素):实现accept()方法,调用访问者的访问方法以完成访问者对自身的访问。
- Object Structure(对象结构):存储并管理元素,提供一个入口,使所有元素被访问。
- 被访问者提供访问入口,使自身的数据被访问者访问。
核心代码
抽象访问者
public interface Visitor {
void visit(Element element);
}
具体访问者
public class ConcreteVisitorA implements Visitor {
@Override
public void visit(Element element) {
if ("man".equals(element.getSex())) {
System.out.println("对男性进行了处理");
} else {
System.out.println("对女性进行了处理");
}
System.out.println("访问人为:" + element.getName());
}
}
public class ConcreteVisitorB implements Visitor {
@Override
public void visit(Element element) {
if ("sh".equals(element.getAddress())) {
System.out.println("对上海群众进行了处理");
} else {
System.out.println("对北京群众进行了处理");
}
System.out.println("访问人为:" + element.getName());
}
}
抽象元素
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public abstract class Element {
private String name;
private String address;
private String sex;
public abstract void accept(Visitor visitor);
}
具体元素
public class BJElement extends Element {
public BJElement(String name, String address, String sex) {
super(name, address, sex);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
System.out.println("visitor 已对北京群众:" + this.getName() + "进行了处理");
}
}
public class SHElement extends Element {
public SHElement(String name, String address, String sex) {
super(name, address, sex);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
System.out.println("visitor 已对上海群众:" + this.getName() + "进行了处理");
}
}
对象结构
@AllArgsConstructor
@NoArgsConstructor
public class ObjectStructure {
private List<Element> elements = new ArrayList<>();
public void add(Element element) {
elements.add(element);
}
public void remove(Element element) {
elements.remove(element);
}
public void handle(Visitor visitor) {
elements.forEach(e -> visitor.visit(e));
}
}
客户端
public class Client {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure() {{
add(new SHElement("张三", "sh", "man"));
add(new BJElement("张老三", "bj", "woman"));
add(new BJElement("李老四", "bj", "woman"));
add(new SHElement("王五", "sh", "man"));
add(new BJElement("王老五", "bj", "woman"));
add(new SHElement("李四", "sh", "man"));
}};
Visitor visitorA = new ConcreteVisitorA();
objectStructure.handle(visitorA);
System.out.println("-----------------------");
Visitor visitorB = new ConcreteVisitorB();
objectStructure.handle(visitorB);
}
}