概述
- 访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。例如处方单中的各种药品信息就是被访问的元素,而划价人员和药房工作人员就是访问者。访问者模式使得用户可以在不修改现有系统的情况下扩展系统的功能,为这些不同类型的元素增加新的操作。
- 在使用访问者模式时,被访问元素通常不是单独存在的,它们存储在一个集合中,这个集合被称为“对象结构”,访问者通过遍历对象结构实现对其中存储的元素的逐个操作。
- 定义:提供一个作用于某对象结构中的各元素的操作表示,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
- 访问者模式是一种对象行为型模式。
- 学习难度:★★★★☆
- 使用频率:★☆☆☆☆
优缺点
类图
组成角色
- 访问者角色(Visitor)
- 具体访问者角色(ConcreteVisitor)
- 元素角色(Element)
- 具体元素角色(ConcreteElement)
- 对象结构角色(ObjectStructure)
Code Example
访问者角色(Visitor)
public interface Visitor {
public void visit(PartA A);
public void visit(PartB B);
}
具体访问者角色(ConcreteVisitor)
public class VisitorA implements Visitor {
public void visit(PartA A) {
System.out.println("A 主管" + A.getName());
}
public void visit(PartB B) {
}
}
public class VisitorB implements Visitor {
public void visit(PartA A) {
}
public void visit(PartB B) {
System.out.println("B 主管" + B.getName());
}
}
public class VisitorCEO implements Visitor {
public void visit(PartA A) {
System.out.println("CEO主管" + A.getName());
}
public void visit(PartB B) {
System.out.println("CEO主管" + B.getName());
}
}
元素角色(Element)
public interface Element {
public void accept(Visitor visitor);
}
具体元素角色(ConcreteElement)
public class PartA implements Element {
String s = "PartA";
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String getName() {
return s;
}
}
public class PartB implements Element {
String s = "PartB";
public void accept(Visitor visitor) {
visitor.visit(this);
}
public String getName() {
return s;
}
}
对象结构角色(ObjectStructure)
public class ObjectStructure {
public List<Element> elements = new ArrayList<Element>();
public void addVisitor(Element element) {
elements.add(element);
}
public void removeVisitor(Element element) {
elements.remove(element);
}
public void accapt(Visitor visitor) {
for (Element element : elements)
element.accept(visitor);
}
}
客户端
public class VisitorPattern {
public static void main(String[] args) {
Visitor ceo = new VisitorCEO();
Visitor a = new VisitorA();
Visitor b = new VisitorB();
Element pa = new PartA();
Element pb = new PartB();
ObjectStructure os = new ObjectStructure();
os.addVisitor(pa);
os.addVisitor(pb);
os.accapt(ceo);
os.accapt(a);
os.accapt(b);
}
}