设计模式——访问者模式22

news2025/2/24 21:05:24

访问者模式能将算法与其所作用的对象隔离开来,分离数据结构与访问数据操作。例如 不同访问者 对不同 文件类型(要素)的操作权限不同。
设计模式,一定要敲代码理解
在这里插入图片描述

元素抽象(被访问的元素)

accept 方法实现 该元素被那个访问者访问

public interface Element {
    void accept(Visitor v);
}

元素实现

例如 文件目录与 .doc文件

/**
 * @author ggbond
 * @date 2024年04月19日 08:46
 */
public class ElementA implements Element {

    // 文件夹名
    private String name;
    private String permissions;

    public ElementA(String name, String permissions) {
        this.name = name;
        this.permissions = permissions;
    }

    public String getName() {
        return name;
    }

    public String getPermissions() {
        return permissions;
    }
    @Override
    public void accept(Visitor v) {
        v.visit(this);
    }
}

访问者抽象

包含对所有具体要素的操作方法

public interface Visitor {
    void visit(ElementA a);
    void visit(ElementB a);
}

访问者实现

普通用户 与 root用户

/**
 * @author ggbond
 * @date 2024年04月19日 08:48
 */
public class Normal implements Visitor {

    private final List<String> permissions=new ArrayList<>(List.of("read"));

    @Override
    public void visit(ElementA a) {
        if (permissions.contains(a.getPermissions())){
            System.out.println("该用户有权利访问"+a.getName());
        }else {
            System.out.println("该用户无权利访问"+a.getName());
        }
    }

    @Override
    public void visit(ElementB a) {
        if (permissions.contains(a.getPermissions())){
            System.out.println("该用户有权利访问"+a.getName());
        }else {
            System.out.println("该用户无权利访问"+a.getName());
        }
    }
}
/**
 * @author ggbond
 * @date 2024年04月19日 08:48
 */
public class Root implements Visitor {

    private final List<String> permissions=new ArrayList<>(List.of("read","write"));

    @Override
    public void visit(ElementA a) {
        if (permissions.contains(a.getPermissions())){
            System.out.println("该用户有权利访问"+a.getName());
        }else {
            System.out.println("该用户无权利访问"+a.getName());
        }
    }

    @Override
    public void visit(ElementB a) {
        if (permissions.contains(a.getPermissions())){
            System.out.println("该用户有权利访问"+a.getName());
        }else {
            System.out.println("该用户无权利访问"+a.getName());
        }
    }
}

对象结构(存储所有元素)

/**
 * @author ggbond
 * @date 2024年04月19日 09:13
 * 包含 全部 具体要素
 */
public class ObjectStructure {
    private List<Element> elementList = new LinkedList<>();

    void addElement(Element element) {
        elementList.add(element);
    }
    // 展示该电脑中的文件和文件夹
    void visit(Visitor visitor) {
        for (Element element: elementList) {
            element.accept(visitor);
        }
    }
}

测试与结果

public class Main {
    public static void main(String[] args) {
        ObjectStructure obj=new ObjectStructure();
        obj.addElement(new ElementA("ggbond 学Java.doc","write"));
        obj.addElement(new ElementA("ggbond Java目录","read"));

        //不同访问者权限不一样
        obj.visit(new Normal());
        System.out.println("------------");
        obj.visit(new Root());
    }
}

总结

满足开闭原则与 单一职责原则。 访问者必须知晓所有的具体元素类,实现所有具体元素的操作方法。

代码下载

代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1609173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】单链表的头节点与尾节点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Appian发布最新版本:通过AI流程自动化推动业务发展

Appian公司于2024年4月16日在弗吉尼亚州麦克莱恩宣布推出Appian平台的最新版本。此版本引入了Process HQ&#xff0c;这是一个集流程挖掘和企业AI于一体的系统&#xff0c;结合了Appian的数据平台。Process HQ为企业运营提供前所未有的可见性&#xff0c;支持数据驱动的决策和流…

nas如何异地共享文件?

nas异地共享文件是一种通过网络实现不同地区电脑与电脑、设备与设备、电脑与设备之间的文件共享的技术。通过nas&#xff08;网络附加存储&#xff09;设备&#xff0c;用户可以在不同地点的电脑或设备之间快速、安全地共享文件和数据。本文将介绍nas异地共享文件的原理以及它在…

宝塔面板使用docker+nginx+gunicorn部署Django项目实战教程

第一步&#xff1a;创建Django项目 使用pip install django安装创建django项目的依赖在电脑某个根目录下执行django-admin startproject app创建一个名为app的Django项目。目录结构如下: ├── app │ ├── init.py │ ├── asgi.py │ ├── settings.py │ ├── url…

SQL注入作业

目录 一、万能密码和二阶注入测试 1.万能密码 2.二阶注入测试 二、联合查询注入测试 1.判断注入点 2.判断当前查询语句的列数 3.查询数据库基本信息 4.查询数据库中的数据 三、报错注入 1. 报错注入函数EXTRATVALUE 2.UPDATEXML 四、盲注测试 1.布尔盲注 判断数据…

【学习】软件压力测试对软件产品的作用

在信息化高速发展的今天&#xff0c;软件产品已经成为各行各业不可或缺的一部分。然而&#xff0c;随着软件功能的日益复杂和用户需求的不断增长&#xff0c;软件产品的稳定性和可靠性问题也愈发凸显。在这样的背景下&#xff0c;软件压力测试作为软件质量保障的重要手段之一&a…

回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现SA-BP模拟退火算法优化BP神经网络多变量回归预测&#xff0…

盗梦攻击:虚拟现实系统中的沉浸式劫持

虚拟现实&#xff08;VR&#xff09;硬件和软件的最新进展将改变我们与世界和彼此互动的方式&#xff0c;VR头显有可能为用户提供几乎与现实无差别的深度沉浸式体验。它们还可以作为一种跨越遥远距离的方式&#xff0c;通过使用个性化的化身或我们的数字代表&#xff0c;促进社…

旅游陪同翻译难吗, 旅游翻译英译中哪家好?

近来&#xff0c;随着中国旅游业的蓬勃发展&#xff0c;旅游陪同翻译的需求也水涨船高&#xff0c;这些专业的翻译服务者为中外游客搭建起友谊的桥梁&#xff0c;引领他们共同探索中国这片古老而神秘的土地 。那么&#xff0c;旅游陪同翻译英译中难吗&#xff1f;我们如何在众多…

机器学习和深度学习-- 李宏毅(笔记于个人理解)Day 21

Day 21 Self- Attention 选修部分 ​ 学完自适应 再回来看看 Sequence Labling 假如我们现在有一个需要读完全部句子才能解的问题&#xff0c; 那么red window 就需要变得是最大的&#xff08;最长的句子&#xff09;&#xff1b; 其实这里大家有没有想过&#xff0c;这个玩意…

Android Studio历史版本下载地址

https://developer.android.com/studio/archive?hlzh-cn https://blog.csdn.net/crasowas/article/details/130304836

豆瓣影评信息爬取 (爬虫)

代码块&#xff1a; from lxml import etree import requestsheaders{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0 }url_list[] for i in range(0,5):i*20urlsf"https:…

顺序表链表经典算法题

1.链表反转 typedef struct ListNode listnode; struct ListNode* reverseList(struct ListNode* head) {if(head NULL){return head;}listnode* p1 NULL;listnode* p2 head;listnode* p3 head->next;while(p2){p2->next p1;p1 p2;p2 p3;if(p3)p3 p3->next;}…

ubuntu22.04 启用 root登录

1&#xff0c;设置 root密码 普通用户输入如下命令给 root 设置密码 sudo passwd root 根据提示设置密码。 2&#xff0c;允许 root 登录 vim /etc/pam.d/gdm-password 以及 vim /etc/pam.d/gdm-autologin 注释两个文件中如下图所示的代码 3&#xff0c;允许 ssh 方式 ro…

移动端适配之viewport

目录 盒模型&#xff1a;widthcontent&#xff08;padding border&#xff09; class"content-box"内容盒模型&#xff08;W3C盒&#xff09; class"border-box"边框盒模型&#xff08;IE 盒&#xff09; scroll滚动 window浏览器视窗&#xff1a;包括…

IP 和 TCP 抓包分析实验

实验拓扑 实验需求 1、配置IP地址&#xff0c;R1的g0/0口是1.1.1.1/24 &#xff0c;R2的g0/0口是1.1.1.2/24 2、在该链路上开启抓包 3、在R1上ping R2 4、开启wireshark&#xff0c;查看抓取的ping包的内容 5、在R2上开启ftp服务 6、在R1上访问R2的FTP 7、在wireshark查…

【游戏专区】贪吃蛇

1&#xff0c;游戏背景 贪吃蛇&#xff08;Snake&#xff09;是一款经典的电子游戏&#xff0c;最初在1976年由 Gremlin 公司开发。它的游戏背景相对简单&#xff0c;但具有高度的成瘾性。 1. **游戏场景**&#xff1a;通常在一个有界的矩形区域内进行&#xff0c;可以是一个…

电磁炉原理笔记

电磁炉加热原理 【电磁炉工作原理&#xff0c;电涡流感应加热原理】 https://www.bilibili.com/video/BV11M411M7Wt/?share_sourcecopy_web&vd_source44c5c5fe44538189ece80f09460cf625 我是看的这个科普视频&#xff1b; 总结一下就是下图&#xff1a; 线圈的磁场影响…

Spring Boot JNA 实现调用 DLL文件(清晰明了)

概述 项目需要用到 重采样算法&#xff0c;JAVA 没有现成的&#xff0c;只能通过 JNA 调用 C 的 DLL 实现&#xff0c;JNA中&#xff0c;它提供了一个动态的C语言编写的转发器&#xff0c;可以自动实现Java和C的数据类型映射。不再需要编写C动态链接库。 实现需求 根据 一个…

rc_visard 3D Stereo Senso

1 简介 rc_visard 3D立体视觉传感器 支持的接口标准 GenICam Generic Interface for CamerasGigE Gigabit Ethernet 词汇表 SGM semi-global matching 半全局匹配 SLAM Simultaneous Localization and Mapping 即时定位与地图构建 2 安全 3 硬件规格 坐标系 rc_visar…