描述
访问者模式(Visitor Pattern)是一种行为设计模式,它可以将算法与数据结构分离开来,从而使得算法可以独立于数据结构而变化。
在访问者模式中,我们定义了一个访问者(Visitor)类,它封装了一些操作,在具体元素(Concrete Element)类中提供一个接受访问者的方法(accept),该方法接受一个访问者对象作为参数,将自身传递给访问者对象进行操作。
实现
表达式抽象
public interface Expression {
int accpet(Visitor visitor);
}
表达式实现
/**
* 数字表达式
*/
public class NumberExpression implements Expression {
private int num;
public NumberExpression(int num) {
this.num = num;
}
@Override
public int accpet(Visitor visitor) {
return visitor.visit((Expression) this);
}
public int getNum() {
return num;
}
}
加法表达式
/**
* 加法表达式
*/
public class AddExpression implements Expression{
private NumberExpression left;
private NumberExpression right;
public AddExpression(NumberExpression left,NumberExpression right) {
this.left = left;
this.right = right;
}
@Override
public int accpet(Visitor visitor) {
return visitor.visit((Expression) this);
}
public NumberExpression getLeft() {
return left;
}
public NumberExpression getRight() {
return right;
}
}
访问者抽象
public interface Visitor {
int visit(Expression expression);
}
访问者实现
public class VisitorImpl implements Visitor {
@Override
public int visit(Expression expression) {
if (expression instanceof NumberExpression) {
return ((NumberExpression) expression).getNum();
} else if (expression instanceof AddExpression) {
return ((AddExpression) expression).getLeft().accpet(this) + ((AddExpression) expression).getRight().accpet(this);
}
return 0;
}
}
使用场景
-
对象结构稳定但需要经常添加新的操作或算法的场景。访问者模式将新的操作或算法与对象结构分离,使得你可以轻松地添加、删除或修改操作或算法,而无需修改现有的对象结构。
-
需要对一个复杂的对象结构进行多种不同的操作或算法的场景。使用访问者模式可以避免代码的重复,增加代码的可维护性和可读性。
-
需要对一个对象结构进行深度遍历的场景。访问者模式可以在遍历对象结构的同时执行操作或算法,而不需要修改对象结构本身。
-
对象结构包含多个类型的对象,并且需要对每种类型的对象执行不同的操作或算法的场景。访问者模式可以通过多态实现不同类型的对象对应不同的操作或算法。