设计模式 24:访问者模式
定义与目的
- 定义:访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
- 目的:该模式的主要目的是分离算法与对象结构,使得可以独立地改变对象结构和作用于这些对象上的操作。
实现示例
假设我们有一个图形编辑器,需要支持不同的图形类型和操作。我们可以使用访问者模式来实现这个需求。
// 抽象元素
interface Shape {
void accept(Visitor visitor);
}
// 具体元素 - 圆形
class Circle implements Shape {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 具体元素 - 矩形
class Rectangle implements Shape {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 抽象访问者
interface Visitor {
void visit(Circle circle);
void visit(Rectangle rectangle);
}
// 具体访问者 - 绘制访问者
class DrawVisitor implements Visitor {
@Override
public void visit(Circle circle) {
System.out.println("Drawing circle...");
}
@Override
public void visit(Rectangle rectangle) {
System.out.println("Drawing rectangle...");
}
}
// 具体访问者 - 打印访问者
class PrintVisitor implements Visitor {
@Override
public void visit(Circle circle) {
System.out.println("Printing circle information...");
}
@Override
public void visit(Rectangle rectangle) {
System.out.println("Printing rectangle information...");
}
}
// 对象结构
class ShapeCollection {
private List<Shape> shapes = new ArrayList<>();
public void addShape(Shape shape) {
shapes.add(shape);
}
public void accept(Visitor visitor) {
for (Shape shape : shapes) {
shape.accept(visitor);
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
ShapeCollection collection = new ShapeCollection();
collection.addShape(new Circle());
collection.addShape(new Rectangle());
Visitor drawVisitor = new DrawVisitor();
collection.accept(drawVisitor);
Visitor printVisitor = new PrintVisitor();
collection.accept(printVisitor);
}
}
使用场景
- 当你需要在不改变对象结构中的元素类的前提下定义新的操作时。
- 当一个对象结构包含多种类型的元素,你想对这些元素执行不同的操作时。
- 当你需要在对象结构上定义多个操作,并且这些操作都与这些对象有关时。
访问者模式通过分离算法与对象结构,使得可以独立地改变对象结构和作用于这些对象上的操作。这对于需要在不改变对象结构中的元素类的前提下定义新的操作的场景非常有用。
小结
访问者模式是一种常用的行为型模式,它可以帮助你分离算法与对象结构,使得可以独立地改变对象结构和作用于这些对象上的操作。这对于需要在不改变对象结构中的元素类的前提下定义新的操作的场景非常有用。