设计模式的艺术 行为型模式之迭代器模式
前言
现在的电视机都配置了一个遥控器,用户可以通过遥控器去选择上一个或者下一个台,我们只需要知道如何使用这个遥控器,而无须关注电视是怎么把电视频道放入其中的,在软件实际的开发中,也有这么一种类,它储存着多个成员对象,这些类通常称为聚合类,对应的对象称为聚合对象。为了方便操作这些聚合对象,同时可以很灵活的为聚合对象增加不同的遍历的方法,也需要类似电视机遥控器一样的角色,可以访问对象的同时又不暴露它内部的结构
什么是迭代器模式 Iterator Pattern
提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor),迭代器模式是一种对象行为型模式
迭代器模式的优点
(1)、支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代器模式中只需要用一个迭代器来替换原有的迭代器即可改变遍历算法,也可以自定义迭代器的子类以支持新的遍历方式。
(2)、迭代器简化了聚合类。由于引入了迭代器,在原有的聚合对象中不需要再自行提供数据遍历等方法,这样可以简化聚合类的设计
(3)、在迭代器模式中,由于引入了抽象层,增加新的聚合类和迭代器都很方便,无须修改原有代码,满足了开闭原则的要求
迭代器模式的缺点
(1)、由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对的增加,这在一定程度上增加了系统的复杂性
(2)、抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展,例如JDK中内置迭代器Iterator就无法实现逆向遍历,如果需要实现逆向遍历,只能通过其子类ListIerator等来实现,而ListIterator迭代器无法用于操作Set类型的聚合对象。在自定义迭代器时,创建一个考虑全面的抽象迭代器并不是一件很容易的事情
迭代器模式的适用场景
(1)、访问一个聚合对象的内容而无须暴露它的内部表示。将聚合对象的访问与内部数据的存储相分离,使得访问聚合对象时无须了解其内部实现细节
(2)、需要为一个聚合对象提供多种遍历方式
(3)、为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合机构提供不同的遍历方式,而客户端可以统一的操作该接口
迭代器模式的具体实现
抽象聚合类
package com.company;import java.util.ArrayList;
import java.util.List;public abstract class AbstractObjectList {protected List<Object> objects=new ArrayList<Object>();public AbstractObjectList(List<Object> objects) {this.objects = objects;}public void removeObject(Object object){this.objects.remove(object);}public List getObjects(){return this.objects;}//声明创建迭代器对象的抽象方法public abstract AbstractIterator createIterator();
}
具体聚合类
package com.company;import java.util.List;//商品数据类:集体聚合类
public class ProductList extends AbstractObjectList {public ProductList(List<Object> objects) {super(objects);}@Override//实现创建迭代器对象的具体工厂类public AbstractIterator createIterator() {return new ProductIterator(this);}
}
抽象迭代器类
package com.company;public interface AbstractIterator {public void next(); //移至下一个元素public boolean isLast(); //判断是否为最后一个元素public void previous(); //移至上一个元素public boolean isFirst(); //判断是否为第一个元素public Object getNextItem(); //获取下一个元素public Object getPreviousItem(); //获取上一个元素
}
具体产品迭代器类
package com.company;import java.util.List;//商品迭代器:具体迭代器
public class ProductIterator implements AbstractIterator {private ProductList productList;private List products;private int cursor1; //定义一个游标,用于记录正向遍历的位置private int cursor2; //定义一个游标,用于记录逆向遍历的位置public ProductIterator(ProductList productList) {this.productList = productList;this.products=productList.getObjects();cursor1=0; //设置正向遍历游标的初始值cursor2=products.size()-1; //设置逆向游标的初始值}@Overridepublic void next() {if(cursor1<products.size()){cursor1++;}}@Overridepublic boolean isLast() {return (cursor1==products.size());}@Overridepublic void previous() {if(cursor2>-1){cursor2--;}}@Overridepublic boolean isFirst() {return (cursor2==-1);}@Overridepublic Object getNextItem() {return products.get(cursor1);}@Overridepublic Object getPreviousItem() {return products.get(cursor2);}
}
客户端测试类
package com.company;import java.util.ArrayList;
import java.util.List;public class Client {public static void main(String[] args) {List products = new ArrayList();products.add("倚天剑");products.add("屠龙刀");products.add("断肠草");products.add("葵花宝典");products.add("四十二章经");AbstractObjectList list;AbstractIterator iterator;list = new ProductList(products); //创建聚合对象iterator = list.createIterator(); //创建迭代器对象System.out.println("正向遍历");while (!iterator.isLast()) {System.out.println(iterator.getNextItem() + ",");iterator.next();}System.out.println();System.out.println("---------------------");System.out.println("逆向遍历");while (!iterator.isFirst()) {System.out.println(iterator.getPreviousItem() + ",");iterator.previous();}}
}
设计模式的艺术 行为型模式之迭代器模式相关推荐
- Java实现二十三种设计模式(五)—— 十一种行为型模式 (中)——解释器模式、迭代器模式、中介者模式、备忘录模式
Java实现二十三种设计模式(五)-- 十一种行为型模式 (中)--解释器模式.迭代器模式.中介者模式.备忘录模式 一.解释器模式 我国 IT 界历来有一个汉语编程梦,虽然各方对于汉语编程争论不休,甚 ...
- 行为型模式:迭代器模式
LieBrother原文: 行为型模式:迭代器模式 十一大行为型模式之六:迭代器模式. 简介 姓名 :迭代器模式 英文名 :Iterator Pattern 价值观 :人生没有回头路 个人介绍 : P ...
- Java进阶篇设计模式之九----- 解释器模式和迭代器模式
前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...
- 设计模式之观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式
前言 这是设计模式的最后一章,包含了剩余的 行为型模式 中的 观察者模式.中介者模式.迭代器模式.访问者模式.备忘录模式.解释器模式 系列文章 第一章:7种设计原则之单一职责原则.接口隔离原则.依赖倒 ...
- 设计模式详解(二十)——迭代器模式
一.场景问题 在激烈的市场竞争中,为了提高自己的硬实力,A公司和B公司决定合并.现在目前二者的员工信息都存放在不同的数据库中,且存储的方式不同,请设计出统一的读取所有员工(A.B公司之和)信息的接口. ...
- 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)
一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
- [导入]C#面向对象设计模式纵横谈(18):(行为型模式) Iterator 迭代器模式.zip(8.04 MB)...
讲座内容: 本培训课程探讨GoF23之 Iterator 迭代器模式的意图.动因.原理.应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用. 课程讲师: 李建忠 上海祝成信息科技有限 ...
- 7、大话设计模式--状态模式 、适配器模式、备忘录模式、组合模式、迭代器模式
第十六章:无尽加班何时休--状态模式 状态模式 : 优点: 缺点: 所使用的项目是:工作状态 功能: 界面: 设计思路: 收获: 附: 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出 ...
最新文章
- ionic + cordova+angularJs 搭建的H5 App完整版总结
- vue select js 设置默认值
- python 内存中的文件操作 StringIO cStringIO 简介
- 【Android 逆向】Android 中常用的 so 动态库 ( 拷贝 /system/lib/ 中的 Android 系统 so 动态库 )
- [Leedcode][JAVA][第739题][每日温度][暴力][单调栈]
- laravel方法汇总详解
- 【2012百度之星资格赛】J:百度的新大厦
- SD敢达服务器源码,《sd高达wars》金手指代码 SD高达G世纪WARS金手指
- (已解决)windows2020卸载office2013(安装程序包语言不受系统支持)
- 中国六大最忙和六大最懒城市
- 数仓(六)从0到1简单搭建数仓ODS层(埋点日志 + 业务数据)
- 2022年电工(初级)考试报名及电工(初级)试题及解析
- 10天学会PHP之PHP快速入门
- [渝粤教育] 西南科技大学 建筑CAD 在线考试复习资料(1)
- 兴趣专业测试软件,霍兰德职业兴趣测试 在线工具
- js:Vue.js自定义指令实现scroll下滑滚动翻页
- 增量更新对开发者有何影响?
- opc-da协议机器数据采集-python
- 有关shift的6大快捷键,同事绝对不会告诉你!
- win无法进入计算机管理,Win10系统右键“管理”无法打开的解决方法