访问者模式

访问者模式

访问者(Visitor)模式:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。

在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了"开闭原则"。

案例

设计一台电脑并提供硬件更新功能

硬件:

java 复制代码
public abstract class Hardware {
    String commond;
    public Hardware(String commond){
        this.commond = commond;
    }

    public abstract void work();
    public abstract void acceptUpdate(Visitor visitor);
}
java 复制代码
public class CPU extends Hardware{
    public CPU(String commond) {
        super(commond);
    }

    @Override
    public void work() {
        System.out.println("cpu正在工作:"+commond);
    }

    @Override
    public void acceptUpdate(Visitor visitor) {
        visitor.visitedCPU(this);
    }
}
java 复制代码
public class Memery extends Hardware{
    public Memery(String commond) {
        super(commond);
    }

    @Override
    public void work() {
        System.out.println("内存正在工作:"+commond);
    }

    @Override
    public void acceptUpdate(Visitor visitor) {
        visitor.visitedMem(this);
    }
}
java 复制代码
public class Disk extends Hardware{
    public Disk(String commond) {
        super(commond);
    }

    @Override
    public void work() {
        System.out.println("磁盘正在工作:"+commond);
    }

    @Override
    public void acceptUpdate(Visitor visitor) {
        visitor.visitedDisk(this);
    }
}

更新包:

java 复制代码
public interface Visitor {
    void visitedCPU(CPU cpu);
    
    void visitedMem(Memery memery);
    
    void visitedDisk(Disk disk);
}
java 复制代码
public class UpdatePackage implements Visitor{
    String update;

    public UpdatePackage(String update){
        this.update = update;
    }


    @Override
    public void visitedCPU(CPU cpu) {
        cpu.commond = update;
    }

    @Override
    public void visitedMem(Memery memery) {
        memery.commond = update;
    }

    @Override
    public void visitedDisk(Disk disk) {
        disk.commond = update;
    }
}

电脑:

java 复制代码
public class Computer {
    private CPU cpu;
    private Memery memery;
    private Disk disk;

    public Computer(CPU cpu, Disk disk, Memery memery) {
        this.cpu = cpu;
        this.disk = disk;
        this.memery = memery;
    }
    public void work(){
        cpu.work();
        memery.work();
        disk.work();
    }
    public void update(Visitor visitor){
        cpu.acceptUpdate(visitor);
        memery.acceptUpdate(visitor);
        disk.acceptUpdate(visitor);
    }
}

测试:

java 复制代码
public class Main {
    public static void main(String[] args) {
        Computer computer = new Computer(new CPU("单机模式"),
                new Disk("单机模式"), new Memery("单机模式"));
        computer.work();
        System.out.println("============");
        computer.update(new UpdatePackage("联网模式"));
        computer.work();
    }
}
相关推荐
鱼鳞_37 分钟前
苍穹外卖-Day07(缓存菜品)
java·缓存
richard_yuu39 分钟前
C#零基础通关第六篇:吃透静态、常量与只读,分清静态与实例的本质差异
开发语言·c#
拂拉氏2 小时前
【项目分享-知识讲解】C++标准库string类的模拟实现+KMP算法讲解+哈希思想了解
开发语言·c++·算法·kmp算法·哈希·string类
枫叶丹42 小时前
【HarmonyOS 6.0】Graphics Accelerate Kit:AI超帧能力技术解析与实践
开发语言·人工智能·华为·harmonyos
HelloAldis2 小时前
Java 库 univer-lib:让 Univer Sheets 与 xlsx 无损双向转换
java·开发语言·xlsx·univer
枕星而眠2 小时前
C++ 类与对象核心知识点及面试高频题详解
开发语言·c++·面试
2501_930707788 小时前
使用C#代码在 PowerPoint 中组合或取消组合形状
开发语言·c#
晚烛8 小时前
CANN 调试工具与性能剖析:从日志分析到 NPU 行为追踪的完整调试体系
开发语言·windows·python·深度学习·缓存
惊鸿一博8 小时前
图标加载方式_zeroIcon_是否加前缀mdi
开发语言·前端·javascript
王八八。8 小时前
linux后台java、postSQL部署命令
java·linux·运维