1.设计模式-------Iterator
本文主要是参考《图解设计模式》写的读书笔记;
开发中我用到遍历集合时候,无非我常用的就是简单的for循环,foreach,iterator 这三种方式进行遍历!
当然这三种的效率:

学习Iterator模式时候,书上给的案例是这样的,一个书架上面放满了书,书下面有个指针!
大概就这样,画的不好!

首先这书架也就相当于是一个集合,集合中得book就是相当于集合元素,下面的指针就相当于Iterator中得hasNext();
为甚有那么简单的for循环不用,非要搞Iterator干嘛,我第一次时候就这么问的??
看案例吧:
1.先编写一个包含了迭代方法的抽象类
package iterator.Method;
public interface Aggregate {
public abstract Iterator iterator();
}
2.编写实体类
package iterator.Model;
/**
*
* @author zengrong
*
*/
public class Book { private String name; public Book(String name) {
super();
this.name = name;
} public String getName() {
return name;
} @Override
public String toString() {
return "Book [name=" + name + "]";
} }
package iterator.Model; import iterator.Method.Aggregate;
import iterator.Method.Iterator;
import iterator.Method.IteratorBookshelf; public class BookShelf implements Aggregate {
private Book books[];
//定义指针的位置
private int last=0;
//获取数据额书 public Book getBookAt(int index) {
return books[index];
}
public BookShelf(int maxsize) {
this.books=new Book[maxsize];
}
//获取长度
public int getLength() {
return last;
}
//添加书
public void appendBook(Book book) {
this.books[last]=book;
last++;
}
//添加
@Override
public Iterator iterator() { return new IteratorBookshelf(this);
}
}
3.编写抽象的iterator
package iterator.Method;
/**
*
* @author zengrong
* 对迭代接口设计二个方法
*/
public interface Iterator {
public abstract boolean has
Next();
public abstract Object next();
}
package iterator.Method; import iterator.Model.Book;
import iterator.Model.BookShelf; /*
* 遍历书架上面书的类
*/
public class IteratorBookshelf implements Iterator{
private BookShelf bookShelf;
private int index; public IteratorBookshelf(BookShelf bookShelf) {
super();
this.bookShelf = bookShelf;
} public boolean hasNext() {
if(index<bookShelf.getLength()){
return true;
}else{
return false;}
} public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book ;
} }
4 main
package Main; import iterator.Method.Iterator;
import iterator.Model.Book;
import iterator.Model.BookShelf; /**
*
* @author zengrong
* 测试
*/
public class App {
public static void main(String[] args) {
BookShelf bookShelf=new BookShelf(5);
Book book =new Book("苍老师日语全集");
Book book2 =new Book("电影AV无码");
Book book3 =new Book("小泽从你的全世界路过");
Book book4 =new Book("自己动手丰衣足食");
Book book5 =new Book("给我一个杠杆我会撬动你");
bookShelf.appendBook(book);
bookShelf.appendBook(book2);
bookShelf.appendBook(book3);
bookShelf.appendBook(book4);
bookShelf.appendBook(book5); Iterator it = bookShelf.iterator();
while(it.hasNext()){
Book bo = (Book) it.next();
System.out.println(bo);
} }
}

总结:
`1.Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
2.客户端本身是不维护遍历集合的指正,是由iterator来进行维护的!
3.集合的种类进行改变时候我们的遍历是不需要改动的!
1.设计模式-------Iterator的更多相关文章
- [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
- [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
- 使用C# (.NET Core) 实现迭代器设计模式 (Iterator Pattern)
本文的概念来自深入浅出设计模式一书 项目需求 有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单. 这两个菜单是这样的: 菜单项MenuItem的代码是这样的: 最初我们是这样设 ...
- 设计模式-Iterator
本文参(chao)考(xi)<图解设计模式> 结城浩 (作者) 杨文轩 (译者) 1.Iterator 模式 迭代器作用于集合,是用来遍历集合元素的对象. 迭代器模式提供一种方法顺序访问一 ...
- java设计模式-Iterator
Iterator模式 主要是用在容器的遍历上,其他的地方都不怎么用:理解一下,会用了就可以了: 1.背景 请动手自己写一个可以动态添加对象的容器: 代码: ArrayList.java(是自己实现 ...
- [C++设计模式] iterator 迭代器模式
迭代器模式定义:提供一种方法顺序訪问一个聚合对象中各个元素,而又不须要暴露该对象. 迭代器分内部迭代器和外部迭代器.内部迭代器与对象耦合紧密,不推荐使用. 外部迭代器与聚合容器的内部对象松耦合,推荐使 ...
- C++设计模式-Iterator迭代器模式
ref: http://www.cnblogs.com/onlycxue/archive/2013/12/25/3490738.html
- Java设计模式之Iterator模式
分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...
- Java 设计模式实现 不错的引用
这段时间有兴趣重新温习一下设计模式在Java中的实现,碰巧看到一个不错的设计模式总结,这里引用一下作为参考. 创建型模式: JAVA设计模式-Singleton JAVA设计模式-Factory JA ...
随机推荐
- boost/config.hpp文件详解
简要概述 今天突发奇想想看一下boost/config.hpp的内部实现,以及他有哪些功能. 这个头文件都有一个类似的结构,先包含一个头文件,假设为头文件1,然后包含这个头文 件中定义的宏.对于头文件 ...
- 【Hive】Hive 基础
Hive架构: Hive基础 1 概念 1.1 简介 1.1.1 hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表, 并提供简单的sql查询功能,可以将sql语句 ...
- 利用chrony和ntp搭建时间同步服务器
利用chrony和ntp搭建时间同步服务器 环境说明 系统版本 CentOS 6.9 x86_64 Network Time Protocol(NTP,网络时间协议)用于同步它所有客户端时钟的服 ...
- Android SDK安装时出错“android Failed to rename directory”的解决方法
Android SDK安装时出错"android Failed to rename directory"的解决的方法 安装Android SDK时遇到Failed to r ...
- C# Socket.Connect连接请求超时机制
介绍 您可能注意到了,.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都没有直接为Connect/BeginConnect提供超时 ...
- 【Excle数据透视表】如何新建数据透视表样式
如果觉得Excle给出的数据透视表样式不符合自己的心意,可以自己定义一个数据透视表样式 步骤1 单击数据透视表区域任意单元格→数据透视表工具→设计→样式组中的下拉按钮,打开数据透视表样式库→新建数据透 ...
- android中依据不同分辨率dp和px的相互转算
public class PxAndDp { /** * 依据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context ...
- web-压力测试学习
https://blog.linuxeye.com/335.html http://bdql.iteye.com/blog/291987 http://www.cnblogs.com/zhuque/a ...
- 给mysql root用户设置密码
使用其他用户进入数据库, 用select PASSWORD('你要设置的密码'), 然后直接update mysql.user set mysql.user.Password='你PASSWORD( ...
- PHP面试题及答案解析(3)—MySQL数据库
1.mysql_num_rows()和mysql_affected_rows()的区别. mysql_num_rows()和mysql_affected_rows(),这两个函数都作用于 mysql_ ...