行为型--访问者模式

    xiaoxiao2025-04-09  12

    概念


    访问者模式把数据结构和作用于结构上的操作解耦合,使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。数据结构是指包含许多对象的对象结构。

    访问者类定义了对象被访问时的具体操作,当对象接收了一个该类访问者时,就会执行这个操作。所以如果需要在访问同一对象时执行不同操作,就需要添加新的访问者类。

    优点:

    符合单一职责原则。增加新操作很容易,因为增加操作意味着增加新的访问者。优秀的扩展性。灵活性。

    缺点:

    若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。具体元素对 访问者 公布细节,违反了迪米特原则。具体元素变更比较困难。违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

    实现代码:

    在被访问的类里面加一个对外提供接待访问者的接口。在数据基础类里面有一个方法接受访问者,并将自身引用传入该访问者。  

    举例


    public class User1{ public static void main(String[] args) { // 创建一个要作用的对象 ComputerPart computer = new Computer(); // 创建一种访问者类 ComputerPartVisitor visitor1 = new ComputerPartDisplayVisitor(); // computer对象按照visitor1中定义的操作来执行 computer.accept(visitor1); System.out.println(); ComputerPart keyboard1 = new Keyboard(); keyboard1.accept(visitor1); } } // 定义一个表示数据元素的接口 interface ComputerPart { // 接收一个访问者,执行该访问者中定义的实体对象要执行的操作 void accept(ComputerPartVisitor computerPartVisitor); } // 实体类 class Keyboard implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } public void doSomething() { System.out.println("Displaying Keyboard."); } } class Monitor implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } public void doSomething() { System.out.println("Displaying Monitor."); } } class Mouse implements ComputerPart { @Override public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } public void doSomething() { System.out.println("Displaying Mouse."); } } class Computer implements ComputerPart { ComputerPart[] parts; public Computer(){ parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()}; } @Override public void accept(ComputerPartVisitor computerPartVisitor) { for (int i = 0; i < parts.length; i++) { parts[i].accept(computerPartVisitor); } computerPartVisitor.visit(this); } public void doSomething() { System.out.println("Displaying Computer."); } } // 表示访问者的接口 // 定义了一些作用与某些数据结构上的操作 interface ComputerPartVisitor { void visit(Computer computer); void visit(Mouse mouse); void visit(Keyboard keyboard); void visit(Monitor monitor); } // 实现这些操作 // 访问者需要知道数据结构的细节 class ComputerPartDisplayVisitor implements ComputerPartVisitor { @Override public void visit(Computer computer) { computer.doSomething(); } @Override public void visit(Mouse mouse) { mouse.doSomething(); } @Override public void visit(Keyboard keyboard) { keyboard.doSomething(); } @Override public void visit(Monitor monitor) { monitor.doSomething(); } } Output: Displaying Mouse. Displaying Keyboard. Displaying Monitor. Displaying Computer. Displaying Keyboard.
    最新回复(0)