访问者模式(设计模式详解)

访问者模式

描述

访问者模式(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;
    }
}

使用场景

  • 对象结构稳定但需要经常添加新的操作或算法的场景。访问者模式将新的操作或算法与对象结构分离,使得你可以轻松地添加、删除或修改操作或算法,而无需修改现有的对象结构。

  • 需要对一个复杂的对象结构进行多种不同的操作或算法的场景。使用访问者模式可以避免代码的重复,增加代码的可维护性和可读性。

  • 需要对一个对象结构进行深度遍历的场景。访问者模式可以在遍历对象结构的同时执行操作或算法,而不需要修改对象结构本身。

  • 对象结构包含多个类型的对象,并且需要对每种类型的对象执行不同的操作或算法的场景。访问者模式可以通过多态实现不同类型的对象对应不同的操作或算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值