访问者模式

访问者模式

访问者(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();
    }
}
相关推荐
小羊没烦恼!10 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里10 小时前
java中的继承和多态的区别
java
小羊没烦恼!10 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕10 小时前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码11 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖11 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时11 小时前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读11 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang12 小时前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
C语言小火车12 小时前
C/C++ 为什么需要编译器?
开发语言·c++