Java设计模式系列之迭代器模式
迭代器模式定义
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。
迭代器模式的角色构成
(1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove(),
(2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代。
(3)容器角色(Aggregate): 一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等
(4)具体容器角色(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
迭代器模式应用的场景及意义
(1)访问一个聚合对象的内容而无需暴露它的内部表示
(2)支持对聚合对象的多种遍历
1 public interface Iterator { 2 3 public boolean hasNext(); 4 public Object next(); 5 }
定义具体迭代器角色(Concrete Iterator)
1 package patten.design; 2 3 import patten.design.List;; 4 5 public class ConcreteIterator implements Iterator { 6 private List list = null; 7 private int index; 8 9 public ConcreteIterator(List list) { 10 super(); 11 this.list = list; 12 } 13 14 @Override 15 public boolean hasNext() { 16 if (index >= list.getSize()) { 17 return false; 18 } else { 19 return true; 20 } 21 } 22 23 @Override 24 public Object next() { 25 Object object = list.get(index); 26 index++; 27 return object; 28 } 29 30 }
定义容器角色(Aggregate)
1 package patten.design; 2 3 //定义集合可以进行的操作 4 public interface List { 5 6 public void add(Object obj); 7 public Object get(int index); 8 public Iterator iterator(); 9 public int getSize(); 10 }
定义具体容器角色(ConcreteAggregate)
1 package patten.design; 2 3 public class ConcreteAggregate implements List{ 4 5 private Object[] list; 6 private int size=0; 7 private int index=0; 8 public ConcreteAggregate(){ 9 index=0; 10 size=0; 11 list=new Object[100]; 12 } 13 @Override 14 public void add(Object obj) { 15 list[index++]=obj; 16 size++; 17 } 18 19 @Override 20 public Iterator iterator() { 21 22 return new ConcreteIterator(this); 23 } 24 @Override 25 public Object get(int index) { 26 27 return list[index]; 28 } 29 @Override 30 public int getSize() { 31 32 return size; 33 } 34 35 }
代码测试
1 package patten.design; 2 3 public class IteratorTest { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 10 List list=new ConcreteAggregate(); 11 list.add("a"); 12 list.add("b"); 13 list.add("c"); 14 list.add("d"); 15 Iterator it=list.iterator(); 16 while(it.hasNext()){ 17 System.out.println(it.next()); 18 } 19 } 20 21 }
迭代器模式的优缺点:
迭代器模式的优点有:
- 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
- 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
- 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。
迭代器模式的缺点:
- 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。
总的来说: 迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引入迭代器模式,给我们的容器实现一个迭代器。
Java设计模式系列之迭代器模式相关推荐
- Java设计模式系列之——迭代器模式
本篇我们采取倒叙的手法来讲解迭代器模式,先看下面一段我们在平时工作中常见的代码: package com.mazhichu.designpatterns.iterator;import java.ut ...
- Java设计模式系列--责任链模式(应用)
原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...
- Java设计模式 (1) —— Iterator迭代器模式
拿到这个话题,首先搞清楚:什么是迭代器? 大家都学过 for-i 循环,for-i循环的本质就是 通过i++ 或者 i-- ,以实现 从数据的一端 一个一个地遍历数据元素,直到另一端的最后一个元素,将 ...
- Java设计模式系列之——模板方法模式
大事件 关注篮球或者喜欢逛社交网站的朋友们可能都知道,2019年10月5日,NBA休斯顿火箭队总经理莫雷在推特上发布了一张无知的涉港图片,引发全体中国人民的强烈抗议和不满,一时间舆论哗然,此后,NBA ...
- java中的build类_30 Java设计模式系列-建造者(Build)模式
建造者(Build)模式 建造者(Build)模式是非常常见的设计模式之一,写个笔记,记录一下我的学习过程和心得. 首先了解一些Build模式的定义. 将一个复杂对象的构建与它的表示分离,使得同样的构 ...
- Java设计模式系列3-----装饰模式,策略模式,观察者模式
1.装饰模式 装饰(Decorator)模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案. package com.ibeifeng.news;public i ...
- Java 设计模式系列(4) —— 工厂模式
工厂方法模式 工厂模式用于实现逻辑的封装,并通过公共的忌口提供对象的实例化服务,在添加新类时只需要做少量的修改. 1. 静态工厂模式(简单工厂模式) 静态工厂属于创建者模式,静态工厂模式的实现需要三个 ...
- java设计模式4--建造者模式(Builder)
本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...
- Java设计模式系列--观察者模式(使用)
原文网址:Java设计模式系列--观察者模式(使用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的用法. 观察者模式的含义 以微信公众号为例.我们关注了某个微信公众号后能收 ...
- Java设计模式10,建造者模式
目录 一.建造者模式 二.建造者模式的结构 1.抽象建造者(Builder) 2.具体建造者(ConcreteBuilder) 3.指挥者(Director) 4.产品(Product) 三.建造者模 ...
最新文章
- Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
- 从字符串中删除所有出现的char
- python自学教程推荐-学习python中的pandas有没有好的教程推荐?
- 菜鸟学习笔记3——jQuery 选择器
- Jsp-request与requestScope的区别
- 如何处理postman Self-signed SSL certificate blocked错误
- ansys电力变压器模型_变压器模型……一切是如何开始的?
- NT下如何彻底删除Oracle?
- 罗技 GHUB驱动的官方下载网址
- angularJS与IE8整合简介
- 如何选出好用的仓库库存管理系统软件?看文章就知道了
- 【CondaHTTPError: HTTP 404 NOT FOUND for url <https://conda.anaconda.org/conda-forg/noarch/repodata.】
- random.sample函数
- uk码对照表_尺码UK5 对应的中国尺码是多少?
- 维斯易联网络打印机配置教程
- 【CSS】css 给盒子添加四周阴影
- 乐有家携手法大大,实现租房签约数字化
- matlab狄利克雷函数,数论入门1——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛...
- android/iphone/windows/linux声波通讯库
- 24部经典电影的24句话