行为型模式
- 模板方法模式(Template Method Pattern)
- 命令模式(Command Pattern)
- 迭代器模式(Iterator Pattern)
- 观察者模式(Observer Pattern)
- 中介者模式(Mediator Pattern)
- 备忘录模式(Memento Pattern)
- 解释器模式(Interpreter Pattern)
- 状态模式(State Pattern)
- 策略模式(Strategy Pattern)
- 职责链模式(Chain of Responsibility Pattern)
- 访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不改变元素类的前提下,定义作用于这些元素的操作。它通过将操作封装到访问者对象中,使得可以在不修改元素对象的情况下,增加新的操作。
访问者模式的主要组成部分:
- 元素接口(Element):定义接受访问者的方法。
- 具体元素(ConcreteElement):实现元素接口,并实现接受访问者的方法。
- 访问者接口(Visitor):定义对每个具体元素的访问方法。
- 具体访问者(ConcreteVisitor):实现访问者接口,对每个具体元素进行操作。
- 对象结构(ObjectStructure):管理元素对象的集合,它可以通过接受访问者来触发访问操作。
访问者模式的优点:
- 增加新操作:可以在不改变元素类的情况下,增加新的操作。每增加一个新的操作,就只需要添加一个新的访问者。
- 解耦操作和数据结构:访问者模式将操作从数据结构中提取出来,操作逻辑集中在访问者中,元素类仅负责存储数据和提供访问接口。
访问者模式的缺点:
- 增加了系统的复杂度:需要定义多个访问者类和元素类,代码结构可能变得更加复杂。
- 不易于修改元素类:如果元素类频繁修改,可能会导致访问者类的修改也变得复杂。
示例:访问者模式的 Java 实现
1. 定义元素接口(Element)
interface Element {
void accept(Visitor visitor);
}
2. 定义具体元素(ConcreteElement)
class ConcreteElementA implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public void operationA() {
System.out.println("具体元素A的操作A");
}
}
class ConcreteElementB implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public void operationB() {
System.out.println("具体元素B的操作B");
}
}
3. 定义访问者接口(Visitor)
interface Visitor {
void visit(ConcreteElementA elementA);
void visit(ConcreteElementB elementB);
}
4. 定义具体访问者(ConcreteVisitor)
class ConcreteVisitor implements Visitor {
@Override
public void visit(ConcreteElementA elementA) {
System.out.println("具体访问者正在访问具体元素A");
elementA.operationA();
}
@Override
public void visit(ConcreteElementB elementB) {
System.out.println("具体访问者正在访问具体元素B");
elementB.operationB();
}
}
5. 定义对象结构(ObjectStructure)
class ObjectStructure {
private List<Element> elements = new ArrayList<>();
public void addElement(Element element) {
elements.add(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
6. 客户端代码(Client)
public class Client {
public static void main(String[] args) {
// 创建元素对象
Element elementA = new ConcreteElementA();
Element elementB = new ConcreteElementB();
// 创建对象结构,并将元素添加到结构中
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.addElement(elementA);
objectStructure.addElement(elementB);
// 创建访问者
Visitor visitor = new ConcreteVisitor();
// 让对象结构接受访问者
objectStructure.accept(visitor);
}
}
8. 总结
- 元素类(ConcreteElementA、ConcreteElementB):实现了
Element
接口,表示可以被访问的元素,且定义了具体的操作方法。 - 访问者接口(Visitor):定义了访问每个元素的方法。
- 具体访问者(ConcreteVisitor):实现了对每个具体元素的操作。
- 对象结构(ObjectStructure):包含了多个元素对象,负责将访问者传递给每个元素对象。
访问者模式的关键思想是将数据结构和操作分离,使得在不修改数据结构的情况下可以增加新的操作,适用于那些数据结构经常变化,但操作比较固定的场景。
适用场景:
- 需要在不改变对象结构的情况下,增加新的操作时。
- 对象结构中的对象不常变化,但需要对其执行不同的操作时。
文中的示例代码在我的码云:https://gitee.com/ming-super/design-model.git