访问者模式

访问者模式

访问者(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();
    }
}
相关推荐
旦沐已成舟1 小时前
K8S-Pod的环境变量,重启策略,数据持久化,资源限制
java·docker·kubernetes
S-X-S1 小时前
项目集成ELK
java·开发语言·elk
Ting-yu1 小时前
项目实战--网页五子棋(游戏大厅)(3)
java·java-ee·maven·intellij-idea
Johaden2 小时前
EXCEL+Python搞定数据处理(第一部分:Python入门-第2章:开发环境)
开发语言·vscode·python·conda·excel
ByteBlossom6665 小时前
MDX语言的语法糖
开发语言·后端·golang
程序研5 小时前
JAVA之外观模式
java·设计模式
计算机学姐6 小时前
基于微信小程序的驾校预约小程序
java·vue.js·spring boot·后端·spring·微信小程序·小程序
黄名富6 小时前
Kafka 日志存储 — 日志索引
java·分布式·微服务·kafka
m0_748255026 小时前
头歌答案--爬虫实战
java·前端·爬虫
肖田变强不变秃6 小时前
C++实现矩阵Matrix类 实现基本运算
开发语言·c++·matlab·矩阵·有限元·ansys