返回

访问者模式:解耦数据和算法,提升代码可维护性

见解分享

数据与算法的紧密耦合常常给代码维护带来困扰。访问者模式通过将算法封装成一个个独立的访客类,解决这一问题,实现数据与算法的分离,使代码更具灵活性。

就医场景下的访问者模式

在医院就诊过程中,一张处方单包含了患者所需的各种药品信息,就如同我们的数据结构。不同的工作人员,比如药房人员、划价员等,在面对这张处方单时,有着不同的处理方式,这就对应于访问者模式中的不同访客类。当有新的工作人员加入,只需要创建一个新的访客类,无需修改处方单的结构,体现了代码的高可扩展性。

访问者模式的实现

访问者模式主要由以下几个角色构成:

  • 数据结构 (处方单):定义数据结构的接口,提供访问方法。
  • 访客 (药房人员、划价员):定义访问操作的接口,由具体访客类实现。
  • 具体访客类 (药房人员类、划价员类):实现具体的访问操作,比如计算药品总价。

访问者模式的优点

  • 数据和算法的分离: 数据和算法不再紧密耦合,提高了代码可维护性和可扩展性。
  • 灵活性强: 当需要增加新的算法时,只需要添加新的访客类,无需修改原有代码。
  • 可重用性高: 访客类可以被多个数据结构重用,提升代码复用率。

访问者模式的使用场景

访问者模式广泛应用于以下场景:

  • XML文档处理: 通过不同的访客类实现不同的文档解析方式。
  • 代码生成: 通过不同的访客类生成不同语言的代码。
  • 数据可视化: 通过不同的访客类将数据以不同的方式可视化。

代码示例

interface Prescription {
    void accept(Visitor visitor);
}

interface Visitor {
    void visit(Medicine medicine);
    void visit(Dressing dressing);
}

class Medicine implements Prescription {
    private String name;
    private double price;

    public Medicine(String name, double price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}

class Dressing implements Prescription {
    private String type;
    private int quantity;

    public Dressing(String type, int quantity) {
        this.type = type;
        this.quantity = quantity;
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public String getType() {
        return type;
    }

    public int getQuantity() {
        return quantity;
    }
}

class PharmacyVisitor implements Visitor {

    @Override
    public void visit(Medicine medicine) {
        // 处理药品信息
    }

    @Override
    public void visit(Dressing dressing) {
        // 处理敷料信息
    }
}

class BillingVisitor implements Visitor {

    @Override
    public void visit(Medicine medicine) {
        // 计算药品总价
    }

    @Override
    public void visit(Dressing dressing) {
        // 计算敷料总价
    }
}

总结

访问者模式通过将算法封装成独立的访客类,实现数据和算法的分离,提高代码可维护性和可扩展性。它广泛应用于数据处理、代码生成、数据可视化等场景中,为软件开发提供了一种优雅且灵活的解决方案。