Java访问者设计模式

Java访问者设计模式

定义

访问者模式(Visitor Pattern)是一种行为设计模式,它允许在不改变现有对象结构的情况下定义新的操作。它通过将操作逻辑封装在访问者对象中并将其传递给对象结构来实现这一点。对象结构负责遍历其元素并将访问者传递给每个元素,以便元素可以调用访问者的方法并执行操作

对应角色

  • 抽象访问者(Visitor)角色:定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素。
  • 具体访问者(ConcreteVisitor)角色:实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么。
  • 抽象元素(Element)角色:声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数。
  • 具体元素(ConcreteElement)角色:实现抽象元素角色提供的 accept() 操作,其方法体通常都是 visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作。
  • 对象结构(Object Structure)角色:是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法,通常由 List、Set、Map 等聚合类实现。

优缺点

优点

  • 扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。
  • 复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复用程度。
  • 灵活性好。访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可相对自由地演化而不影响系统的数据结构。
    符合单一职责原则。访问者模式把相关的行为封装在一起,构成一个访问者,使每一个访问者的功能都比较单一。

缺点

  • 破坏封装。 访问者模式中具体元素对访问者公布细节,这破坏了对象的封装性。
  • 增加新的元素类很困难。 在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。

应用场景

访问者模式通常用于具有稳定数据结构但易变操作的系统。它允许在不修改现有元素类的情况下添加新的操作,从而提高了系统的扩展性。例如,可以使用访问者模式来实现对复杂对象结构中各个元素的打印、序列化或验证等操作。

实例

一个简单的Java实例是定义一个表示计算机部件(如键盘、鼠标和显示器)的元素类层次结构,并定义一个表示计算机部件访问者的接口,该接口具有针对每种部件类型的visit方法。然后可以定义具体的访问者类来执行特定操作,例如显示部件信息或执行硬件检查。这些访问者可以在运行时传递给计算机对象,并遍历其部件以执行所需操作。

//抽象元素
interface ComputerPart {
    void accept(ComputerPartVisitor computerPartVisitor);
}
//具体元素
class CPU implements ComputerPart {
    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}
//具体元素
class Memory implements ComputerPart {
    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}
//对象结构
class Computer implements ComputerPart {
    private ComputerPart[] parts;

    public Computer() {
        parts = new ComputerPart[] {new CPU(), new Memory()};
    }

    @Override
    public void accept(ComputerPartVisitor computerPartVisitor) {
        for (int i = 0; i < parts.length; i++) {
            parts[i].accept(computerPartVisitor);
        }
        computerPartVisitor.visit(this);
    }
}
//抽象访问者
interface ComputerPartVisitor {
    void visit(CPU cpu);
    void visit(Memory memory);
    void visit(Computer computer);
}
//具体访问者
class ComputerPartDisplayVisitor implements ComputerPartVisitor {
    @Override
    public void visit(CPU cpu) {
        System.out.println("Displaying CPU.");
    }

    @Override
    public void visit(Memory memory) {
        System.out.println("Displaying Memory.");
    }

    @Override
    public void visit(Computer computer) {
        System.out.println("Displaying Computer.");
    }
}
//运行实例
public class VisitorPatternDemo {
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.accept(new ComputerPartDisplayVisitor());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幽·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值