• 【设计模式】访问者模式



    在这里插入图片描述

    主页传送门:💁 传送

    1.访问者模式定义

           访问者模式(Visitor Pattern),是一种相对简单的设计模式。其定义如下:

    Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

           即:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
           其通用类图如下:
    在这里插入图片描述

    2.访问者模式的角色

    访问者模式涉及到的角色如下:

    • 抽象访问者(Visitor)角色:
      声明了一个或者多个方法操作,形成所有的具体访问者角色必须实现的接口。
    • 具体访问者(ConcreteVisitor)角色:
      实现抽象访问者所声明的接口,也就是抽象访问者所声明的各个访问操作。
    • 抽象节点(Node)角色:
      声明一个接受操作,接受一个访问者对象作为一个参数。
    • 具体节点(ConcreteNode)角色:
      实现了抽象节点所规定的接受操作。
    • 结构对象(ObjectStructure)角色:
      有如下的责任,可以遍历结构中的所有元素;如果需要,提供一个高层次的接口让访问者对象可以访问每一个元素;如果需要,可以设计成一个复合对象或者一个聚集,如List或Set。

    3.访问者模式实战案例

    3.1.场景说明

           使用访问者模式完成对计算机各个硬件的访问。

    3.2.UML类图

           使用访问者模式来实现的结构图如下:
    在这里插入图片描述

    3.3.代码实现

    创建硬件抽象类

    public abstract class Hardware {
        String type ;//型号
        //构造器
        public Hardware(String type )
        {
            this.type = type;
        }
    
        public String getType()
        {return this.type;}
    
        //运转
        public abstract void run();
    
        //接受计算机的访问者
        public abstract void accept(ComputerVisitor computerVisitor);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    创建具体硬件
    CPU

    public class CPU extends Hardware {
        public CPU(String type) {
            super(type);
        }
    
        @Override
        public void run() {
            System.out.println("型号为"+type+"的CPU正在运行...");
        }
    
        @Override
        public void accept(ComputerVisitor computerVisitor) {
            computerVisitor.visitCPU(this);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    硬盘

    public class HardDisk extends Hardware {
        public HardDisk(String type) {
            super(type);
        }
    
        @Override
        public void run() {
            System.out.println("型号为"+type+"的硬盘正在运行...");
        }
    
        @Override
        public void accept(ComputerVisitor computerVisitor) {
            computerVisitor.visitHardDisk(this);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    创建电脑访问者抽象类

    public interface ComputerVisitor {
        void visitCPU(CPU cpu);//访问CPU
        void visitHardDisk(HardDisk hardDisk);//访问硬盘
    }
    
    • 1
    • 2
    • 3
    • 4

    创建电脑访问者的具体实现类

    public class RunVisitor implements ComputerVisitor {
        @Override
        public void visitCPU(CPU cpu) {
            cpu.run();
        }
    
        @Override
        public void visitHardDisk(HardDisk hardDisk) {
            hardDisk.run();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    public class TypeVisitor implements ComputerVisitor {
        @Override
        public void visitCPU(CPU cpu) {
            System.out.println("CPU型号:"+cpu.getType());
        }
    
        @Override
        public void visitHardDisk(HardDisk hardDisk) {
            System.out.println("硬盘型号:"+hardDisk.getType());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    创建电脑类

    public class Computer {
        private Hardware cpu;
        private Hardware hardDisk;
    
        public Computer()
        {
            this.cpu = new CPU("Tntel Core i7-620");
            this.hardDisk = new HardDisk("Seagate 500G 7200转");
        }
    
        public void accept(ComputerVisitor computerVisitor)
        {
            cpu.accept(computerVisitor);
            hardDisk.accept(computerVisitor);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    创建测试类

    public class Client {
        public static void main(String[] args) {
            Computer computer = new Computer();
            //类型访问者
            ComputerVisitor typeVisitor = new TypeVisitor();
            //运行的硬件访问者
            ComputerVisitor runVisitor = new RunVisitor();
    
            computer.accept(typeVisitor);
            System.out.println("-------------------------");
            computer.accept(runVisitor);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    测试结果:
    在这里插入图片描述

    4.访问者模式优缺点

    访问者模式的优点主要包括:

    • 增加了新的操作很容易,只需要增加一个新的访问者即可。
    • 将相关的行为封装到一个访问者中,可以实现更好的代码组织和管理。
    • 访问者模式符合单一职责原则,每个类只负责一个职责。

    访问者模式的缺点主要包括:

    • 具体元素对访问者公布细节,违反了迪米特原则。
    • 具体元素变更比较困难,因为访问者模式依赖于具体类的细节。
    • 违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

    5.访问者模式适用场景

    访问者模式适用于以下场景:

    1. 数据结构相对稳定,而操作易于变化的情况。
    2. 需要对一个对象结构进行很多不同的操作,而不是仅仅对整个对象结构做一些简单操作。
    3. 需要对对象结构中的各个元素进行很多不同的操作,而不是仅仅对对象结构中某个特定元素做一些简单操作。

    6.访问者模式总结

         访问者模式是一种行为型设计模式,它将数据结构与数据操作分离,使得在不改变数据结构的前提下可以定义作用于这些元素的新的操作。该模式主要针对系统中拥有固定类型数的对象结构,在其内提供一个accept()方法来接受访问者对象的访问。不同的访问者对同一个元素的访问内容是不同的,使得相同的元素集合可以产生不同的数据结果。
         总的来说,访问者模式适用于数据结构相对稳定,而操作易于变化的情况。在使用时,需要根据实际需求权衡利弊,注意避免违反设计原则的问题。同时,访问者模式也需要根据具体的应用场景来进行选择和设计,以满足系统的需求和变化。

    如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论
    你的支持就是我✍️创作的动力! 💞💞💞

  • 相关阅读:
    毕业设计- 基于单片机与GPS+GSM的车辆定位跟踪系统
    01_finetuning_and_guidance_CN
    flask学生信息管理
    5.2 增量式开发(思想很好)
    CAN原理讲解,以及NVIDIA的tx2接收can消息,并进行can设置(开发实战二)
    【调制解调】SSB 单边带调幅
    AI算法检测对无人军用车辆的MitM攻击
    windows使用vim编辑文本powershell
    基于RIP的MGRE实验
    k8s--基础--27.3--企业级devops平台--jenkins的CI/CD
  • 原文地址:https://blog.csdn.net/hm973046/article/details/133607588