第十七章 访问者模式

news2025/1/21 20:30:25

文章目录

  • 前言
  • 一、访问者模式基本介绍
  • 二、访问者模式应用实例
    • 完整代码
    • 评测抽象类 Action
    • 成功评价 Success
    • 失败评价
    • 评价人抽象类
    • 男性
    • 女性
    • 数据结构,管理很多人评价
    • Clint 测试
    • 添加 wait 选票
    • clint 测试
  • 三、访问者模式的注意事项和细节


前言

在这里插入图片描述
在这里插入图片描述


一、访问者模式基本介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、访问者模式应用实例

在这里插入图片描述
在这里插入图片描述

完整代码

评测抽象类 Action

package tanchishell.SJMS.visitor;

//评测抽象接口
public abstract class Action {

    //得到男性 的测评
    public abstract void getManResult(Man man);

    //得到女的 测评
    public abstract void getWomanResult(Woman woma);
}

成功评价 Success

package tanchishell.SJMS.visitor;

public class Success extends Action {
    @Override
    public void getManResult(Man man) {

        System.out.println(" 男人给的评价该歌手很成功 !");
    }
    @Override
    public void getWomanResult(Woman woman) {

        System.out.println(" 女人给的评价该歌手很成功 !");
    }
}

失败评价

package tanchishell.SJMS.visitor;

public class Fail extends Action {

    @Override
    public void getManResult(Man man) {

        System.out.println(" 男人给的评价该歌手失败 !");
    }
    @Override
    public void getWomanResult(Woman woman) {

        System.out.println(" 女人给的评价该歌手失败 !");
    }
}

评价人抽象类

package tanchishell.SJMS.visitor;

public abstract class Person {

    //提供一个方法,让访问者可以访问
    public abstract void accept(Action action);
}

男性

package tanchishell.SJMS.visitor;

public class Man extends Person{

    @Override
    public void accept(Action action) {

        //获取男性的评价
        action.getManResult(this);
    }
}

女性

package tanchishell.SJMS.visitor;

//说明
//1. 这里我们使用到了双分派, 即首先在客户端程序中,将具体状态作为参数传递 Woman 中(第一次分派)
//2. 然后 Woman 类调用作为参数的 "具体方法" 中方法 getWomanResult, 同时将自己(this)作为参数
// 传入,完成第二次的分派,也就是当参数被传递到当前方法后,立即有执行了其他方法,当前方法更像再分派一个任务,而不是在执行一个任务。
public class Woman extends Person {
    @Override
    public void accept(Action action) {
        action.getWomanResult(this);
    }
}

数据结构,管理很多人评价

package tanchishell.SJMS.visitor;


import java.util.LinkedList;
import java.util.List;

//数据结构,管理很多人(Man , Woman)
public class ObjectStructure {

    //维护了一个集合
    private List<Person> persons = new LinkedList<>();

    //增加到 list
    public void attach(Person p) {
        persons.add(p);
    }

    //移除
    public void detach(Person p) {
        persons.remove(p);
    }

    //显示测评情况
    public void display(Action action) {
        for (Person p : persons) {
            p.accept(action);
        }
    }
}

Clint 测试

package tanchishell.SJMS.visitor;

public class Client {

    /**
     * 流程:
     *    先创建 objectStructure 传入  Man Woman,然后获取 success 或者  fail
     *    调用 display传入 success,需要一个 Action,然后调用到了 Person的 accept 方法
     *    然后会调用到 getManResult 方法获取评价 最后输出 System.out.println(" 男人给的评价该歌手很成功 !");
     *
     */
    public static void main(String[] args) {
        //创建 ObjectStructure
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.attach(new Man());
        objectStructure.attach(new Woman());
        //成功
        Success success = new Success();
        objectStructure.display(success);
        System.out.println("===============");
        Fail fail = new Fail();
        objectStructure.display(fail);


//        System.out.println("=======给的是待定的测评========");
//        Wait wait = new Wait();
//        objectStructure.display(wait);
    }
}

输出

 男人给的评价该歌手很成功 !
 女人给的评价该歌手很成功 !
===============
 男人给的评价该歌手失败 !
 女人给的评价该歌手失败 !

添加 wait 选票

在这里插入图片描述

package tanchishell.SJMS.visitor;

public class Wait extends Action {

    public void getManResult(Man man) {

        System.out.println(" 男人给的评价是该歌手待定 ..");
    }

    public void getWomanResult(Woman woman){
        System.out.println(" 女人给的评价是该歌手待定 ..");

    }
}

clint 测试

package tanchishell.SJMS.visitor;

public class Client {

    /**
     * 流程:
     *    先创建 objectStructure 传入  Man Woman,然后获取 success 或者  fail
     *    调用 display传入 success,需要一个 Action,然后调用到了 Person的 accept 方法
     *    然后会调用到 getManResult 方法获取评价 最后输出 System.out.println(" 男人给的评价该歌手很成功 !");
     *
     */
    public static void main(String[] args) {
        //创建 ObjectStructure
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.attach(new Man());
        objectStructure.attach(new Woman());
        //成功
        Success success = new Success();
        objectStructure.display(success);
        System.out.println("===============");
        Fail fail = new Fail();
        objectStructure.display(fail);

        System.out.println("=======给的是待定的测评========");
        Wait wait = new Wait();
        objectStructure.display(wait);
    }
}


输出

 男人给的评价该歌手很成功 !
 女人给的评价该歌手很成功 !
===============
 男人给的评价该歌手失败 !
 女人给的评价该歌手失败 !
=======给的是待定的测评========
 男人给的评价是该歌手待定 ..
 女人给的评价是该歌手待定 ..

三、访问者模式的注意事项和细节

在这里插入图片描述

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

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

相关文章

Vue2 脚手架下载及配置淘宝镜像--和ieda的配置和打开

目录 Vue2 脚手架下载及配置淘宝镜像 为什么需要 Vue Cli 脚手架? 环境配置&#xff0c;搭建项目 1. 搭建 Vue2 脚手架工程&#xff0c; 2.查看 3.冲突 4. 下载 5. 安装 6. 验证 7. 先删除以前的 cli 版本<不论是之前未下载或没有下载> 8. 安装淘宝镜像-cnpm…

20230427配置cv1826的buildroot在串口免登录的方法二

20230427配置cv1826的buildroot在串口免登录的方法二 2023/4/27 16:46 进度&#xff1a;可以拿掉密码&#xff0c;但是无法拿掉用户名&#xff01; 1、 Z:\buildroot1\buildroot\configs\cvitek_cv182x_defconfig BR2_TOOLCHAIN_EXTERNAL_GCC_6y BR2_TOOL…

编译一个魔兽世界开源服务端Windows需要安装什么环境

编译一个魔兽世界开源服务端Windows需要安装什么环境 大家好我是艾西&#xff0c;去年十月份左右wy和bx发布了在停服的公告。当时不少小伙伴都在担心如果停服了怎么办&#xff0c;魔兽这游戏伴随着我们渡过了太多的时光。但已经发生的事情我们只能顺其自然的等待GF的消息就好了…

Selenium基础篇之键盘操作(一)

文章目录 前言一、常用方法(上)二、小剧场2.1场景2.2代码2.2.1引入库2.2.2启动浏览器实例2.2.3访问C站首页2.2.4窗口最大化2.2.5获取输入框元素2.2.6向输入框输入文字2.2.7使用退格键删除最后一个字符2.2.8全选输入框文字2.2.9剪切输入框文字2.2.10粘贴文字到输入框2.2.11回车查…

经验分享 | 科研行业如何搭建RASP防护体系?

多年来&#xff0c;开源网安长期服务金融、政府、科技等大型企业&#xff0c;针对不同实际应用场景&#xff0c;打造出了成熟落地的解决方案&#xff0c;提高并完善了企业安全防护技术与管理体系。今天&#xff0c;我们就来了解开源网安是如何为科研行业搭建RASP防护体系的。 科…

“ ES6+ —— 让你的JavaScript代码从平凡到精彩 “

前期回顾 【提高代码可读性】—— 手握多个代码优化技巧、细数哪些惊艳一时的策略_0.活在风浪里的博客-CSDN博客代码优化对象策略https://blog.csdn.net/m0_57904695/article/details/128318224?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%…

GQCNN

Berkeley AUTOLAB’s GQCNN Package — GQCNN 1.1.0 documentation (berkeleyautomation.github.io) (3条消息) 机器人抓取&#xff08;六&#xff09;—— 抓取点检测&#xff08;抓取位姿估计&#xff09; gqcnn代码测试与解读_zxxRobot的博客-CSDN博客 GQ-CNN模型对生成数据…

C#,OpenCv开发指南(02)——OpenCvSharp编程入门与矩阵Mat的基础知识

在 Visual Studio 中很方便搭建与使用 OpenCV 的 C# 的开发环境&#xff0c;几乎不用键盘输入。 使用 C# 开发 OpenCV 可以直接成为工业软件产品&#xff0c;而不是实验室程序。世界上几乎所有的视频厂家都提供 C# OpenCV 开发接口。 C#&#xff0c;人工智能&#xff0c;深度学…

常见jvm调优操作详细记录

最近很多小伙伴跟我说&#xff0c;自己学了不少JVM的调优知识&#xff0c;但是在实际工作中却不知道何时对JVM进行调优。今天&#xff0c;我就为大家介绍几种JVM调优的场景。 cpu占用过高 cpu占用过高要分情况讨论&#xff0c;是不是业务上在搞活动&#xff0c;突然有大批的流…

SpringBoot整合ELK做日志(超完整)

SpringBoot整合ELK日志系统 SpringBoot整合ELK做日志环境准备安装包准备ELK安装包Java11安装包 软件安装安装java11安装ElasticSearch安装Kibana安装Logstash 编写SpringBoot项目初始化SpringBoot项目修改代码编写Controller SpringBoot整合ELK做日志 环境准备 提前准备一台C…

SpringBoot+Linux操作系统与项目部署(这一篇就够了|超详细)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

华为联合openEuler发布全新NFS+协议,实现NAS存储性能与可靠性倍增

在openEuler开发者大会2023上&#xff0c;华为携手openEuler发布NFS协议&#xff0c;实现单客户端访问NAS存储可靠性提升3倍、性能提升6倍&#xff0c;助力NAS存储全面满足新型生产核心场景下苛刻要求。 在数字转型的新时代&#xff0c;非结构化数据价值持续提升。金融、大企业…

一种IPC通信机制Gdbus详解

一、DBus介绍 常规进程间通信有管道&#xff0c;消息队列&#xff0c;共享内存&#xff0c;以及socket等&#xff0c;每个都有优劣&#xff0c;这次我们介绍一种高阶的进程间通信方式DBus。 DBus通信是IPC通信机制的一种方式&#xff0c;本身是建立在socket机制之上&#xff0…

计算机网络——快速了解常见应用层协议体系

文章目录 〇、加密算法对称加密非对称加密 一、远程登录——TELNET、SSH1.Telnet2.SSH 二、文件传输——FTP、SFTP、FTPS1.FTP2.SFTP3.FTPSSSL工作原理 三、电子邮件——SMTP、POP、IMAP1.SMTP&#xff08;推送邮件&#xff09;2.POP&#xff08;接收邮件&#xff09;3.IMAP 四…

计算机中的数据存储

计算机的存储规则&#xff1a; 文本、图片、声音所有的数据存储 在计算机当中一般会有三类数据&#xff1a;文本数据、图片数据以及声音数据其中文本它又包含了数字、字母以及汉字视频的本质是图片和声音的组合体。在计算机当中&#xff0c;任意的数据都是以二进制的形式来存储…

【Matlab】基于偏格式动态线性化的无模型自适应控制

例题来源&#xff1a;侯忠生教授的《无模型自适应控制&#xff1a;理论与应用》&#xff08;2013年科学出版社&#xff09;。 &#x1f449;对应书本 4.3 单输入单输出系统(SISO)偏格式动态线性化(PFDL)的无模型自适应控制(MFAC) 上一篇博客介绍了基于紧格式动态线性化的无模型…

K8S---Service

服务原理 容器化的问题&#xff1a; 1.自动调度 无法预知pod所在节点&#xff0c;pod的IP地址 2.有故障时&#xff0c;换新节点新ip进行部署 service就是解决这些问题 自动跟踪 clusterip不变 都能找到对应pod 主要靠后端pod的标签 负载均衡 通过iptables/LVS规则将访问的请…

MySQL 数据库概述

数据&#xff08;Data&#xff09; 描述事物的符号记录包括数字&#xff0c;文字、图形、图像、声音、档案记录等以“记录”形式按统一的格式进行存储 表 将不同的记录组织在一起用来存储具体数据 记录&#xff1a;行 字段&#xff08;属性&#xff09;&#xff1a;列 数…

[Gitops--7]Kubesphere 配置镜像仓库

Kubesphere 配置镜像仓库 1. Harbor https证书配置 1.1 生成Harbor证书 mkdir /apps/harbor/cert -p cd /apps/harbor/cert openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -subj "/CCN/STShanghai/LShanghai/Opana/OUDevops/CNharbor.i…

HBase(3):集群搭建

1 基础环境需求 jdk1.8以上Hadoopzookeeper 2 下载HBase安装包 Apache Downloads 3 安装 3.1 上传解压HBase安装包 tar -xvzf hbase-3.0.0-alpha-3-bin.tar.gz -C /opt/ 3.2 修改HBase配置文件 &#xff08;1&#xff09;修改hbase-env.sh cd /opt/hbase-3.0.0-alpha-3-bi…