热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【读码练习/cron4j】(二)半个设计模式:不暴露底层表现(简化了的迭代器模式)...

重读笔记第一次:这篇总结写的不好,自己的东西重看的也比较累,不高兴改了,就写这里吧。主要总结迭代器的两个功能的左边那个&#x

重读笔记第一次:

这篇总结写的不好,自己的东西重看的也比较累,不高兴改了,就写这里吧。

主要总结迭代器的两个功能的左边那个:不暴露底层,也可以说是统一接口以备泛用。

其实cron4j也不是没有返回迭代器,只是不如教科书上的那样死板而已。

再补充下java类库的aggregate角色和iterator角色。

分别是java.lang.iterable和java.util.iterator

就这样吧

经典的迭代器模式,有两个功能

1、提供一个方式顺序访问集合

2、不暴露底层的表现形式。

经典的迭代模式有四个角色。

aggregate、concreteAggregate、iterator、concreteIterator。

aggreate里通常有一个方法 iterator  createrIterator(); 返回迭代器

iterator里也通常有一个方法 next() 从集合顺序访问元素

 


cron4j的简化

在cron4j这个模式得到简化。(TaskCollector是aggregate角色,FileTableCollector是concreteAggregate)

1、没有了抽象的iterator角色。

2、interator也没有了next()。

publicinterface TaskCollector {
public TaskTable getTasks();
}

 

1 class FileTaskCollector implements TaskCollector {
2
3 private ArrayList files =new ArrayList();
4
5 publicsynchronizedvoid addFile(File file) {
6 files.add(file);
7 }
8
9 publicsynchronizedvoid removeFile(File file) {
10 files.remove(file);
11 }
12
13 publicsynchronized File[] getFiles() {
14 int size = files.size();
15 File[] ret =new File[size];
16 for (int i &#61;0; i < size; i&#43;&#43;) {
17 ret[i] &#61; (File) files.get(i);
18 }
19 return ret;
20 }
21
22 publicsynchronized TaskTable getTasks() {
23 TaskTable ret &#61;new TaskTable();
24 int size &#61; files.size();
25 for (int i &#61;0; i < size; i&#43;&#43;) {
26 File f &#61; (File) files.get(i);
27 TaskTable aux &#61;null;
28 try {
29 aux &#61; CronParser.parse(f);
30 } catch (IOException e) {
31 Exception e1 &#61;new Exception("Cannot parse cron file: "
32 &#43; f.getAbsolutePath(), e);
33 e1.printStackTrace();
34 }
35 if (aux !&#61;null) {
36 int auxSize &#61; aux.size();
37 for (int j &#61;0; j < auxSize; j&#43;&#43;) {
38 ret.add(aux.getSchedulingPattern(j), aux.getTask(j));
39 }
40 }
41 }
42 return ret;
43 }
44
45 }

 

 

1 publicclass TaskTable {
2
3 privateint size &#61;0;
4
5 private ArrayList patterns &#61;new ArrayList();
6
7 private ArrayList tasks &#61;new ArrayList();
8
9 publicvoid add(SchedulingPattern pattern, Task task) {
10 patterns.add(pattern);
11 tasks.add(task);
12 size&#43;&#43;;
13 }
14
15 publicint size() {
16 return size;
17 }
18
19 public Task getTask(int index) throws IndexOutOfBoundsException {
20 return (Task) tasks.get(index);
21 }
22
23
24 public SchedulingPattern getSchedulingPattern(int index)
25 throws IndexOutOfBoundsException {
26 return (SchedulingPattern) patterns.get(index);
27 }
28
29 publicvoid remove(int index) throws IndexOutOfBoundsException {
30 tasks.remove(index);
31 patterns.remove(index);
32 size--;
33 }
34
35 }



这样的简化好还是不好呢&#xff1f;

从代码看&#xff0c;迭代器的迭代方法next()被省略掉了。如果要遍历的话&#xff0c;必须通过size()、getTask(index),getSchedulingPattern(index)

但如果我们去实现一个next方法&#xff0c;可能还要把一对Task、和Pattern包装成一个类&#xff0c;然后还要再包装他们的方法。

这样似乎就得不偿失了。

 

 

思考

迭代器的重点之一是把集合&#xff08;File对象或者其他Object&#xff09;和表现形式&#xff08;TaskTable&#xff09;分离。可以单独用于场景

迭代器模式&#xff0c;如果要迭代的对象复杂&#xff0c;不易封装&#xff0c;next()方法不要也罢。

模式对应场景可以提高对应的效率&#xff0c;不必拘泥形式。

转:https://www.cnblogs.com/mattmonkey/archive/2011/08/28/2301547.html



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
author-avatar
zhengfke
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有