cola架构:cola源码中访问者模式应用浅析

news2024/11/12 10:17:39

目录

1.访问者模式简介

2.cola访问者模式应用

2.1 cola被访问者类图

2.2 cola访问者类图


我们知道,如果一个对象结构包含很多类型的对象,希望对这些对象实施一些依赖其具体类型的操作,但又避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类,那么可以使用访问者设计模式;它使得我们可以将相关的访问操作集中起来定义在访问者类中,将对象本身与对象的访问操作分离。

在cola框架中,针对状态机(StateMachine)和状态(State)就应用了访问者模式,下面进行具体分析;

1.访问者模式简介

访问者(Visitor)模式:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。

访问者模式包含的类/接口如下:

  • 抽象访问者(Visitor):定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素。

  • 具体访问者(ConcreteVisitor):实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么。

  • 抽象元素(Element):声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数。

  • 具体元素(ConcreteElement):实现抽象元素角色提供的 accept() 操作,其方法体通常都是 visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作

  • 对象结构(Object Structure):是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法,通常由 List、Set、Map 等聚合类实现。

 相关类图及引用结构如下:

2.cola访问者模式应用

2.1 cola被访问者类图

cola被访问者类图如下,包含被访问者State和StateMachine:

Visitable接口定义了accept接口,接受Visitor参数对象:

public interface Visitable {
    String accept(final Visitor visitor);
}

StateImpl实现accept接口如下:

public class StateImpl<S,E,C> implements State<S,E,C> {

    @Override
    public String accept(Visitor visitor) {
        String entry = visitor.visitOnEntry(this);
        String exit = visitor.visitOnExit(this);
        return entry + exit;
    }
}

StateMachineImpl实现accept接口如下:

public class StateMachineImpl<S, E, C> implements StateMachine<S, E, C> {

    @Override
    public String accept(Visitor visitor) {
        StringBuilder sb = new StringBuilder();
        sb.append(visitor.visitOnEntry(this));
        for (State state : stateMap.values()) {
            sb.append(state.accept(visitor));
        }
        sb.append(visitor.visitOnExit(this));
        return sb.toString();
    }
}

 实现逻辑里,通过简单调用访问者类的visit方法完成对被访问者的访问。

2.2 cola访问者类图

cola访问者包含PlantUMLVisitor和SysOutVisitor,类图如下:

Visitor接口约定了分别针对State和StateMachine的visit接口方法:

/**
 * Visitor
 *
 * @author Frank Zhang
 * @date 2020-02-08 8:41 PM
 */
public interface Visitor {

    char LF = '\n';

    /**
     * @param visitable the element to be visited.
     * @return
     */
    String visitOnEntry(StateMachine<?, ?, ?> visitable);

    /**
     * @param visitable the element to be visited.
     * @return
     */
    String visitOnExit(StateMachine<?, ?, ?> visitable);

    /**
     * @param visitable the element to be visited.
     * @return
     */
    String visitOnEntry(State<?, ?, ?> visitable);

    /**
     * @param visitable the element to be visited.
     * @return
     */
    String visitOnExit(State<?, ?, ?> visitable);
}
  • PlantUMLVisitor实现了针对State和StateMachine的plantuml方式的输出格式;
  • SysOutVisitor实现了对State和StateMachine简单日志输出;
/**
 * PlantUMLVisitor
 *
 * @author Frank Zhang
 * @date 2020-02-09 7:47 PM
 */
public class PlantUMLVisitor implements Visitor {

    /**
     * Since the state machine is stateless, there is no initial state.
     *
     * You have to add "[*] -> initialState" to mark it as a state machine diagram.
     * otherwise it will be recognized as a sequence diagram.
     *
     * @param visitable the element to be visited.
     * @return
     */
    @Override
    public String visitOnEntry(StateMachine<?, ?, ?> visitable) {
        return "@startuml" + LF;
    }

    @Override
    public String visitOnExit(StateMachine<?, ?, ?> visitable) {
        return "@enduml";
    }

    @Override
    public String visitOnEntry(State<?, ?, ?> state) {
        StringBuilder sb = new StringBuilder();
        for(Transition transition: state.getAllTransitions()){
            sb.append(transition.getSource().getId())
                    .append(" --> ")
                    .append(transition.getTarget().getId())
                    .append(" : ")
                    .append(transition.getEvent())
                    .append(LF);
        }
        return sb.toString();
    }

    @Override
    public String visitOnExit(State<?, ?, ?> state) {
        return "";
    }
}
/**
 * SysOutVisitor
 *
 * @author Frank Zhang
 * @date 2020-02-08 8:48 PM
 */
public class SysOutVisitor implements Visitor {

    @Override
    public String visitOnEntry(StateMachine<?, ?, ?> stateMachine) {
        String entry = "-----StateMachine:"+stateMachine.getMachineId()+"-------";
        System.out.println(entry);
        return entry;
    }

    @Override
    public String visitOnExit(StateMachine<?, ?, ?> stateMachine) {
        String exit = "------------------------";
        System.out.println(exit);
        return exit;
    }

    @Override
    public String visitOnEntry(State<?, ?, ?> state) {
        StringBuilder sb = new StringBuilder();
        String stateStr = "State:"+state.getId();
        sb.append(stateStr).append(LF);
        System.out.println(stateStr);
        for(Transition transition: state.getAllTransitions()){
            String transitionStr = "    Transition:"+transition;
            sb.append(transitionStr).append(LF);
            System.out.println(transitionStr);
        }
        return sb.toString();
    }

    @Override
    public String visitOnExit(State<?, ?, ?> visitable) {
        return "";
    }
}

至此,应用访问者模式,实现了将被访问类和访问操作进行逻辑隔离、解耦。

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

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

相关文章

[ACTF2020 新生赛]Include

【解题思路】 1.打开链接 发现好东西&#xff0c;进一步分析。 2.分析页面 发现网页得到一个GET请求-->?fileflag.php 可以推断&#xff0c;要解答该题目需要获取 flag.php 的源代码. 将flag.php文件进行base64编码&#xff08;将网页源代码转换为Base64编码&#xff…

Java截取(提取)子字符串(substring()),Java分割字符串(split())

在 String 中提供了两个截取字符串的方法&#xff0c;一个是从指定位置截取到字符串结尾&#xff0c;另一个是截取指定范围的内容。下面对这两种方法分别进行介绍。 1. substring(int beginIndex) 形式 此方式用于提取从索引位置开始至结尾处的字符串部分。调用时&#xff0c…

基于SpringBoot的设备管理系统

基于SpringBootVue的设备管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven角色&#xff1a;管理员、员工、用户 系统展示 管理员界面 员工界面 用户界面 摘要 基于Sp…

【鸿蒙软件开发】ArkTS基础组件之Gauge(环形图表)、LoadingProgress(动态加载)

文章目录 前言一、Gauge环形图表1.1 子组件1.2 接口参数介绍 1.2 属性1.3 示例代码二、LoadingProgress2.1 子组件2.2 接口2.3 属性2.4 示例代码 总结 前言 Gauge&#xff1a;数据量规图表组件&#xff0c;用于将数据展示为环形图表。 LoadingProgress&#xff1a;用于显示加载…

【STM32】标准库的引入

一、为什么要会有标志外设库 1、传统单片机软件开发方式 (1)芯片厂商提供数据手册、示例代码、开发环境 (2)单片机软件工程师面向产品功能&#xff0c;查阅数据手册&#xff0c;参考官方示例代码进行开发 (3)硬件操作的方式是用C语言对寄存器进行读写以操作硬件 (4)主要工作量…

揭秘提升远程团队协作效率的秘密武器:这款在线白板工具不容错过!

说到出色的远程团队协作工具&#xff0c;任何已经完善了远程/混合工作模式的公司都使用了大量的在线协作软件。TrustRadius进行的一项调查显示&#xff0c;三分之二的企业正在投资于网络会议软件。 对于任务跟踪、协作工作或员工互动&#xff0c;市场上有许多工具可供选择。不…

2023年【电工(技师)】证考试及电工(技师)模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;技师&#xff09;证考试根据新电工&#xff08;技师&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将电工&#xff08;技师&#xff09;模拟考试试题进行汇编&#xff0c;组成一套电工…

Redis数据类型——set类型数据交并差操作

1.业务场景 2.求两个set集合中交并补的操作

电流源,恒流源,直流电子负载

四个并联比一个电阻噪声小 ADI方案

HuggingFace 国内下载 阿里云盘下载速度20MB/s

文章目录 效果展示思路阿里云盘API工具 aligo安装aligoaligo教程实战 保存模型到阿里云盘海外服务器下载模型装包aligo的上传代码 国内下载其他方式 效果展示 Huggingface被屏蔽了&#xff0c;根本下载不了。 阿里云盘下载速度最高可达20MB/s&#xff0c;平均17MB/s左右。【注…

充气膜建筑的形体设计

建筑体量、形象、材料、色彩等都对应同周围环境协调。建筑设计构思要把客观存在的“境”与主管构思的“意”融合起来。一方面要分析环境对建筑可能产生的影响&#xff0c;另一方面要分析设想中的建筑在自然环境中的地位。因地制宜&#xff0c;结合地形的 高低起伏&#xff0c;利…

UG\NX二次开发 在资源栏(左侧面板)中添加按钮

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 apolloryd 订阅本专栏,非常感谢。 简介 UG\NX二次开发 在资源栏(左侧面板)中添加按钮,下面提供了帮助说明,在 UGOPEN 文件夹下有示例。 C++语言在UG二次…

选择合适的项目管理系统来支持专业产品研发团队

专业产品研发团队的公司离不开其严谨的管理和高效的研发流程&#xff0c;为了进一步提升研发效率和管理水平&#xff0c;产研团队需要一个全流程的项目管理系统来支持其研发团队的协同合作。 一、系统需求 IT行业的研发工作涵盖了从立项、项目变更到项目的进程计划等多个环节。…

Windows server部署filebeat到kafka

需求&#xff1a;Windows dhcp日志需要实时传输到elk或者其他告警平台。 1、filebeat下载地址&#xff1a;https://www.elastic.co/cn/downloads/beats/filebeat 2、下载后解压后配置filebeat.yml文件&#xff0c; 3、README.md文件中有运行的操作方法&#xff1a;cmd上进入f…

基于springboot财务管理系统

基于springboot财务管理系统 系统主要包括首页&#xff0c;个人中心&#xff0c;员工管理&#xff0c;部门管理&#xff0c;员工工资管理&#xff0c;工资调整管理&#xff0c;资产类别管理&#xff0c;固定资产管理&#xff0c;经营信息管理&#xff0c;序时账管理&#xff0c…

从0到1配置TensorRT环境

根据博文&#xff1a;TensorFlow2.x模型转onnx、TensorRT给出的环境来配置。 以下是该博文中给出的版本信息 TensorFlow 2.4 CUDA 11.1 CUDNN 8 TensorRT 8.2.1.8 tf2onnx 1.13.0 onnx 1.12.0 下载地址 包下载地址TensorRT 8.2.1.8https://developer.nvidia.com/nvidia-tenso…

代码随想录 Day27 贪心02中 LeetCode T55跳跃游戏

LeetCode T55 跳跃游戏 题目链接:55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 这题我们可以换一个思想,将跳跃问题转换为覆盖问题,我们每遇到一个元素就跳到这个元素可以覆盖到的最大位置,当能覆盖下整个数组的时候,就说明能达到,返回true,否则返回false …

机关事务管理局数字化平台,让数据纵向直报,业务横向打通

机关事务管理局的核心职能是实现对机关事务的管理、保障、服务&#xff0c;是面向政府机关部门的“后勤服务”部门。 主要职能有&#xff1a;推进国有资产管理、公务用车管理、办公用房管理、公共机构节能管理、后勤管理等。党和政府“过紧日子”的要求为机关事务工作提出了更…

1600*C. Remove Adjacent(贪心字符串)

Problem - 1321C - Codeforces 解析&#xff1a; 贪心&#xff0c;从z到a遍历&#xff0c;每次循环减去符合题意的字符。 #include<bits/stdc.h> using namespace std; signed main(){int n;string s;cin>>n>>s;for(char iz;i>a;i--){for(int j0;j<s.…

使用SPSS进行重复测量方差分析-包括数据正态性检验

最近在处理重复测量数据&#xff0c;新学了重复测量方差分析、广义估计方程这两个方法&#xff0c;都是在SPSS中进行的。只有数据服从正态分布才可以用重复测量方差分析&#xff0c;如果不符合可以用广义估计方程或者其它方法&#xff0c;这次先介绍重复测量方差分析 具体的操…