访问者模式

访问者模式

访问者(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();
    }
}
相关推荐
码农飞飞23 分钟前
详解Rust结构体struct用法
开发语言·数据结构·后端·rust·成员函数·方法·结构体
《源码好优多》1 小时前
基于Java Springboot出租车管理网站
java·开发语言·spring boot
余辉zmh2 小时前
【c++篇】:深入c++的set和map容器--掌握提升编程效率的利器
开发语言·c++
·云扬·5 小时前
Java IO 与 BIO、NIO、AIO 详解
java·开发语言·笔记·学习·nio·1024程序员节
求积分不加C5 小时前
Spring Boot中使用AOP和反射机制设计一个的幂等注解(两种持久化模式),简单易懂教程
java·spring boot·后端
枫叶_v6 小时前
【SpringBoot】26 实体映射工具(MapStruct)
java·spring boot·后端
东方巴黎~Sunsiny6 小时前
java-图算法
java·开发语言·算法
2401_857617627 小时前
汽车资讯新趋势:Spring Boot技术解读
java·spring boot·后端
小林学习编程8 小时前
从零开始理解Spring Security的认证与授权
java·后端·spring
写bug的羊羊8 小时前
Spring Boot整合Nacos启动时 Failed to rename context [nacos] as [xxx]
java·spring boot·后端