设计模式之Visitor Pattern(访问者模式)

Visitor Pattern 是一种行为设计模式,它允许你在不修改已有类结构的情况下定义新的操作。该模式将算法与其操作的对象结构分离,是解决"双重分发"问题的经典方案。

核心概念

主要角色

  1. Visitor(访问者接口):声明了一组访问方法,每个方法对应一个具体元素类,

  2. ConcreteVisitor(具体访问者):实现访问者接口中声明的操作

  3. Element(元素接口):定义accept方法,接收访问者对象

  4. ConcreteElement(具体元素):实现accept方法

  5. ObjectStructure(对象结构):能枚举它的元素,可以提供一个高层接口允许访问者访问它的元素

模拟一个实例

先定于接口

// 访问者接口
public interface ComputerPartVisitor {
    void visit(Computer computer);
    void visit(Mouse mouse);
    void visit(Keyboard keyboard);
    void visit(Monitor monitor);
}

// 元素接口
public interface ComputerPart {
    void accept(ComputerPartVisitor visitor);
}

定义实现类:
 

// 具体元素类 - 键盘
public class Keyboard implements ComputerPart {
    @Override
    public void accept(ComputerPartVisitor visitor) {
        visitor.visit(this);
    }
}

// 具体元素类 - 显示器
public class Monitor implements ComputerPart {
    @Override
    public void accept(ComputerPartVisitor visitor) {
        visitor.visit(this);
    }
}

// 具体元素类 - 鼠标
public class Mouse implements ComputerPart {
    @Override
    public void accept(ComputerPartVisitor visitor) {
        visitor.visit(this);
    }
}

// 具体元素类 - 计算机(包含多个部件)
public class Computer implements ComputerPart {
    private ComputerPart[] parts;

    public Computer() {
        parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
    }

    @Override
    public void accept(ComputerPartVisitor visitor) {
        for (ComputerPart part : parts) {
            part.accept(visitor);
        }
        visitor.visit(this);
    }
}
// 具体访问者 - 显示部件信息
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
    @Override
    public void visit(Computer computer) {
        System.out.println("Displaying Computer.");
    }

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

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

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

// 具体访问者 - 检查部件状态
public class ComputerPartCheckVisitor implements ComputerPartVisitor {
    @Override
    public void visit(Computer computer) {
        System.out.println("Checking Computer status.");
    }

    @Override
    public void visit(Mouse mouse) {
        System.out.println("Checking Mouse status.");
    }

    @Override
    public void visit(Keyboard keyboard) {
        System.out.println("Checking Keyboard status.");
    }

    @Override
    public void visit(Monitor monitor) {
        System.out.println("Checking Monitor status.");
    }
}

测试类

public class VisitorPatternDemo {
    public static void main(String[] args) {
        ComputerPart computer = new Computer();
        
        // 使用显示访问者
        computer.accept(new ComputerPartDisplayVisitor());
        
        System.out.println("------");
        
        // 使用检查访问者
        computer.accept(new ComputerPartCheckVisitor());
    }
}

输出

设计模式之Visitor Pattern(访问者模式)_第1张图片

  1. 破坏封装:访问者模式要求元素类公开一些内部状态和操作

  2. 元素类变更困难:每增加一个元素类,访问者接口和所有具体访问者都要相应修改

  3. 可能违反依赖倒置原则:具体访问者依赖具体元素类而非抽象

Visitor Pattern 是处理复杂对象结构上多种操作的有效方式,特别适合在元素类稳定但操作频繁变化的场景中使用。

你可能感兴趣的:(设计模式,访问者模式)