访问者模式

访问者模式

访问者(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();
    }
}
相关推荐
当代红领巾26 分钟前
模拟斗地主发扑克的编程
java
ling1s1 小时前
C#基础(4)封装——成员方法
开发语言·c#
爱数学的程序猿1 小时前
【C++篇】启航——初识C++(上篇)
开发语言·c++
一丝晨光2 小时前
void类型
java·开发语言·javascript·c++·c#·go·c
Hello Dam3 小时前
【文件增量备份系统】MySQL百万量级数据量分页查询性能优化
java·mysql·性能优化·springboot·深分页优化
雷工笔记3 小时前
C#知识|设计模式的分类及认识
开发语言·设计模式·c#
IT学长编程4 小时前
计算机毕业设计 C语言学习辅导网站的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计·计算机毕业设计选题
学步_技术4 小时前
Python编码系列—Python访问者模式:为对象结构添加新功能的艺术
开发语言·python·访问者模式
IT学长编程4 小时前
计算机毕业设计 办公用品管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·办公用品管理系统