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 ...
随机推荐
- ElasticSearch高级查询
ElasticSearch高级查询 https://www.imooc.com/video/15759/0 ElasticSearch查询 1,子条件查询:特定字段查询所指特定值 1.1query c ...
- WIN7 安装其他的系统boot
1,安装win7系统不赘述. 2,在安装完win7系统后,准备安装CentOS7.0 3,准备ISO文件和所需软件 1.CentOS官网下载DVD ISO文件 一般选择DVD ISO 2 ...
- C#.NET为List加入扩展方法:获取唯一值
public static class ListTools { /// <summary> /// 获取唯一值列表 /// </summary> /// <param n ...
- idea 热部署
- Web项目中用mybatis配置多个数据库
需要在项目中配置多个数据库(比如一个mysql,一个oracle)的时候,可按照如下方式配置 首先是第一个数据库的配置 <bean name="transactionManager&q ...
- 解决https协议服务器内部无法跳转的问题
<!-- 定义视图文件解析{视图解析器} --> <bean class="org.springframework.web.servlet.view.InternalRes ...
- SSO单点登录系列6:cas单点登录防止登出退出后刷新后退ticket失效报500错
这个问题之前就发现过,最近有几个哥们一直在问我这个怎么搞,我手上在做另一个项目,cas就暂时搁浅了几周.现在我们来一起改一下你的应用(client2/3)的web.xml来解决这个2b问题,首先看下错 ...
- ubuntu12.04 下安装nodejs
liunx里面安装nodejs我也找了非常多文章,貌似对非常多liunx新手来讲不是非常清楚,以下是我结合一些文章,亲自实践得到的安装步骤.同一时候还有大家关心的与seajs紧密相关的spm模块的安装 ...
- 根域名服务器 根服务器一般指根域名服务器 (DNS)
Why There Are Only 13 DNS Root Name Servers -------------------------------------------------------- ...
- iconfont的简单使用
下载-阿里巴巴矢量图标 网站链接:http://www.iconfont.cn/ 首页如下: 首页-进入图标库--所有图标--搜索/点击你想要的图标--添加购物车 点击购物车(下载) 如下图: 点击下 ...