设计模式实战 | 迭代器模式 | 分词器

news2024/9/20 22:57:27

1、场景

假设有下面这样一个字符串属性, 代表着属性逐级调用, 我们需要解析出每一个字段属性方便我们后续进行业务处理。

String properties = "school.teacher[语文].student[3].user[4].english.score";

2、传统写法

遍历该属性字符串然后不断截取出每一个字段, 然后按顺序收集到集合中

    public static void main(String[] args) {
        String properties = "school.teacher[语文].student[3].user[4].english.score";
        int index = -1;
        List<Unit> unitList = new ArrayList<>();
        while((index = properties.indexOf(".")) != -1){
            String prop = properties.substring(0,index);
            properties = properties.substring(index+1);
            Unit unit = new Unit();
            unit.setIndexedName(prop);
            if (prop.contains("[")){
                int ltIndex = prop.indexOf("[");
                unit.setName(prop.substring(0,ltIndex));
                unit.setIndex(prop.substring(ltIndex+1,ltIndex+2));
            }else {
                unit.setName(prop);
            }
            unitList.add(unit);
        }
    }
    
    @Data
    public static class Unit {
        private String indexedName;
        private String name;
        private String index;
    }

运行结果:
在这里插入图片描述

3、迭代器模式

基于面向对象处理和分治的思想, 可以认为 属性字符串 school.teacher[语文].student[3]的处理逻辑和 子串teacher[语文].student[3] 的处理逻辑是一致的。 所以只需要逐级迭代获取出子串,然后将子串交给该逻辑处理, 然后该逻辑又会不断重复只不过处理的逻辑单元变小了而已。

/**
   分词单元:  负责将一个属性字符串分解成各个部分
*/
@Data
public  class PropertyUnit {

    private String fullName;
    private String indexedName;
    private String name;
    private String index;
    private String children;
    
    public PropertyUnit(String fullname) {
        this.fullName = fullname;
        int delim = fullname.indexOf('.');
        if (delim > -1) {
            name = fullname.substring(0, delim);
            children = fullname.substring(delim + 1);
        } else {
            name = fullname;
            children = null;
        }
        indexedName = name;
        delim = name.indexOf('[');
        if (delim > -1) {
            index = name.substring(delim + 1, name.length() - 1);
            name = name.substring(0, delim);
        }
    }
}
/**
	分词器:  
	    实现了迭代器, 通过将next方法将子串的处理交给下一个分词单元, 这样就可逐级迭代每个属性字段。
*/
public class PropertyTokenizer implements Iterable<PropertyTokenizer>, Iterator<PropertyTokenizer> {

    private PropertyUnit cur;

    public PropertyTokenizer(String fullName) {
        this.cur = new PropertyUnit("."+fullName);
    }

    @Override
    public Iterator<PropertyTokenizer> iterator() {
        return this;
    }

    @Override
    public boolean hasNext() {
        return cur.getChildren() != null;
    }

    @Override
    public PropertyTokenizer next() {
        this.cur = new PropertyUnit(this.cur.getChildren());
        return this;
    }

    public String getIndexedName() {
        return cur.getIndexedName();
    }

    public String getFullName() {
        return cur.getFullName();
    }

    public String getName() {
        return cur.getName();
    }

    public String getIndex() {
        return cur.getIndex();
    }

    public String getChildren() {
        return cur.getChildren();
    }


    public static void main(String[] args) {
       String properties = "school.teacher[语文].student[3].user[4].english.score";
        
        // 迭代器遍历
        Iterator<PropertyTokenizer> iterator = new PropertyTokenizer(properties).iterator();
        while (iterator.hasNext()) {
            PropertyTokenizer next = iterator.next();
            System.out.println(next.getIndexedName());
        }

        System.out.println("==========");
        
        // 增强for循环遍历
        PropertyTokenizer tokenizer1 = new PropertyTokenizer(properties);
        for (PropertyTokenizer propertyTokenizer1 : tokenizer1) {
            System.out.println(propertyTokenizer1.getIndexedName());
        }
    }
}

运行结果:

school
teacher[语文]
student[3]
user[4]
english
score

4、总结

  • 通过改进,将整体的分词逻辑交给具体的迭代分词器处理。 与传统写法不同的是,如果每个属性单元可能会有不同的处理逻辑,此方法依旧可以进行扩展只需要在next获取具体的分词单元即可而不影响整体处理逻辑。
  • 实际上就是将外部的遍历的逻辑放到的对象的递归调用里面, 这个思想在许多场景里面是非常有用, 因为对象是可以多态的, 每一个态的具体处理逻辑又可以不同,但整体逻辑又是相同, 所以最终所以所组合出来的逻辑分支数量是指数级的, 如果不做这样的处理全部放到外部遍历处理就会产生大量的嵌套的if else分支处理逻辑。
  • 当然迭代器模式主要用于数据的迭代, 通过创建不同的迭代器可以将不同数据的不同迭代里逻辑独立出来, 比如这里就是一个场景, 还有一些复杂的数据结构图和树等存在各种什么深度、广度遍历、前序遍历逻辑都可以创建不同的迭代器去处理。所以如果你的业务数据有自己的不同的迭代逻辑就可以使用此模式去处理。
  • 很多人固定认为迭代器与集合绑定就是对集合的处理, 但这只是广义上所谓的"集合"。 本质是对数据的迭代, 这个数据可以是任何东西
  • 基于此思想可以去扩展其他不同的属性逐级分词处理逻辑

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

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

相关文章

ChatGLM-6B模型结构组件源码阅读

一、前言 本文将介绍ChatGLM-6B的模型结构组件源码。 代练链接&#xff1a;https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py 二、激活函数 torch.jit.script def gelu_impl(x):"""OpenAIs gelu implementation."""r…

k8s系列(三)——kubernetes架构及部署

引入 在正式引入K8s之前&#xff0c;我们先来看一张图 虚拟化技术演历路径可分为三个时代&#xff1a; 物理机时代&#xff0c;多个应用程序可能跑在一台物理机器上&#xff1b; 这种方式会造成一旦某个服务出现溢出或者未知的错误&#xff0c;从而影响机器上所有服务的正常…

C++ -- 红黑树封装set和map

文章目录 1. 红黑树概念和性质1.1 概念1.2 性质1.3 实例1.4 分析 2. 节点定义3. 插入操作4. 检测5. 红黑树代码6. 红黑树实现set和map6.0 类设计图6.1 红黑树包装复用6.2 红黑树实现set6.3 红黑树实现map6.4 剖析代码6.4.1 如何复用6.4.2 如何区分set和map比较方式6.4.3 set和m…

如何用appuploader上架

转载&#xff1a;下载和安装appuploader IOS开发工具官网地址 Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 最新版本已经优化了没支付688给apple的账号登录流程&#xff0c;无需再安装其他软件。…

SDK案例配置记录

目前的极简配置 注意事项 默认的属性配置中&#xff0c;大多采用环境变量的形式&#xff0c;方便不同设备通用 比如“常规”->“输出目录”为 $(SolutionDir)..\bin\win_msvc2017$(Platform)\$(Configuration)\案例运行前的配置&#xff08;除MwBatchSimPlugin&#xff0…

如何评估用户需求的价值?关键看4方面

一、需求本身是否有价值 评估一个需求是否有价值&#xff0c;主要是通过以下几个方面&#xff1a;需求的产生源、需求产生的时机&#xff08;情景价值&#xff09;、需求如何产生&#xff08;问题解决价值&#xff09;、需求如何解决&#xff08;解决需求&#xff09;。 在情景…

web安全学习笔记【网络安全】

前言 本文简单记录一下我学习 Web 安全方面的笔记。 本文不涉及 IIS、Windows 和 SqlServer 的安全管理与配置&#xff0c;尽量只谈编程相关的安全问题。 这个 Web 安全学习路线&#xff0c;整体大概半年左右&#xff0c;具体视每个人的情况而定。 &#xff08;上传一直很模…

支持AI算法定制的4G摄像头模组解决方案

随着科技的不断发展&#xff0c;现在人们对于监控摄像头的需求越来越高&#xff0c;但是市场上的大多数摄像头组件都是标准化的&#xff0c;很难满足不同应用场景的需求。 不过&#xff0c;现在有了这款支持AI算法定制的4G摄像头模组解决方案&#xff0c;这个问题就完美的解决了…

shell脚本教程

目录 一、shell历史 二、执行脚本 三、基本语法 3.1变量 3.1.1变量的分类 3.1.2删除变量 3.2文件名代换&#xff08;Globbing&#xff09; 3.3命令代换 3.4算术代换 3.5转义字符 3.6单引号 3.7双引号 四、Shell脚本语法 4.1条件测试 4.2分支 4.2.1if/then/elif…

重磅!用友荣登全球5强

近日&#xff0c;全球权威信息技术研究和顾问公司Gartner发布《Market Share: All Software Markets, Worldwide&#xff0c;2022》报告&#xff0c;用友在EAM&#xff08;资产管理&#xff09;市场再创新高&#xff0c;市场占有率位居全球第五位&#xff0c;亚太第一位&#x…

quic详解

目录 一 http简介 二 quic协议详解 1 重传机制 2 流量控制 3连接迁移 一 http简介 http0.9 1991年发布&#xff0c; 没有header&#xff0c;功能非常简单&#xff0c;只支持GET http1.0 1996年发布&#xff0c;明文传输安全性差&#xff0c;header特别大。它相对0.9有以…

postgres_exporter 部署

目录 - 下载地址- 配置环境变量- 启动vim ./start.shvim ./stop.shqueries.yaml - 配置prometheus - 下载地址 https://github.com/prometheus-community/postgres_exporter/releases - 配置环境变量 - 启动 因启动前需要配置环境变量后再进行启动 运行如下语句&#xff1a…

【自动化测试入门知识】自动化测试生命周期

如今&#xff0c;项目经理和开发人员面临着用最少的资源并在日渐缩减的时间表中构建可靠应用程序的挑战。因此&#xff0c;组织正在转向自动化测试以有效地实现此目标。 在自动化测试方面&#xff0c;我们许多人认为这只是SDLC&#xff08;软件开发生命周期&#xff09;的一部…

【竣达】浅谈电视台机房智能化动力环境监控系统管理

电视台作为面向全国甚至是世界的广播平台&#xff0c;在节目转播过程中不能有任何的闪失&#xff0c;为了最大限度保障电视节目的安全播出&#xff0c;一套完整的机房动力环境监控系统必不可少。 电视台机房及广播控制室建立包括机房动力、环境及安防的监控系统&#xff0c;主…

30岁女程序媛,对职业和未来的迷茫和焦虑

前言 2023快过去一半马上就要2024年了&#xff0c;92年的我就要步入30的行列了。 一转眼&#xff0c;也到了三十而立的年纪。 反观自己&#xff0c;到了这个时候&#xff0c;更多的是迷茫、彷徨、焦虑、无措 但也在不断地跌跌撞撞中&#xff0c;找到了自己的节奏和目标。 …

程序员一个月拿两万,得知卖猪肉可以赚五万,你是选择做程序员还是卖猪肉?

在知乎上看到这么个帖子&#xff0c;觉得挺有意思&#xff0c;大家一起瞧瞧&#xff1f; 对此&#xff0c;我也看到了许多犀利的回答哈 **A&#xff1a;**我反过来问你&#xff0c;如果一对夫妇卖猪肉一个月只能挣一万&#xff0c;听说一名程序员一个月拿五万&#xff0c;他们…

【轻量化网络系列(1)】MobileNetV1论文超详细解读(翻译 +学习笔记+代码实现)

前言 这几天学了一下轻量化网络&#xff0c;我们先从MobileNetV1讲起吧~ MobileNetV1网络是谷歌团队在2017年提出的&#xff0c;专注于移动端和嵌入设备的轻量级CNN网络&#xff0c;相比于传统的神经网络&#xff0c;在准确率小幅度降低的前提下大大减少模型的参数与运算量。…

机器学习 day13(正则化,线性回归的正则化,逻辑回归的正则化)

正则化的思想 如果特征的参数值更小&#xff0c;那么对模型有影响的特征就越少&#xff0c;模型就越简单&#xff0c;因此就不太容易过拟合 如上图所示&#xff0c;成本函数中有W₃和W₄&#xff0c;且他们的系数很大&#xff0c;要想让该成本函数达到最小值&#xff0c;就得使…

【软件测试】未来软件测试必备的八大技能!你缺少哪个?

软件测试工程师是个神奇的职业&#xff0c;他是开发人员与老板之间的传话筒&#xff08;三夹板&#xff09;&#xff0c;也是开发人员与老板的好帮手&#xff1b; 他不仅需要有销售的沟通能力&#xff0c;也需要具备编辑人员的文档撰写技巧。如此一个面面俱到的岗位&#xff0…

软件设计师--易错题集结

计算机组成与结构 海明校验码是在n个数据位之外增选择题设k个校验位&#xff0c;从而形成一个kn位的新的码字&#xff0c;使新的码字的码距比较均匀地拉大。n与k的关系是&#xff08;A&#xff09;。 A、2k-1≥nk B、2n-1≤nk C、nk D、n-1≤k 知识&#xff1a; 确定要传输的信…