[toc]

迭代器模式的类图

类图的解释

名称 说明
Aggregate 集合接口,有提供迭代器的方法
Iterator 迭代器接口,提供迭代操作
BookShelf 书架类
Book 书类
BookShelfIterator 书架类的迭代器

迭代器模式的代码

//集合接口
public interface Aggregate {
//生成迭代器的方法
public abstract Iterator iterator();
} //迭代器接口
public interface Iterator {
public abstract boolean hasNext();
public abstract Object next();
} //书架类
public class BookShelf implements Aggregate {
private Book[] books;
private int last = 0;
public BookShelf(int maxSize) {
this.books = new Book[maxSize];
}
public Book getBookAt(int index) {
return this.books[index];
}
public void appendBook(Book book) {
this.books[last] = book;
last++;
}
public int getLength() {
return last;
}
//获得BookShelf迭代器
public Iterator iterator() {
return new BookShelfIterator(this);
}
} //书类
public class Book {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
} //书架迭代器类
public class BookShelfIterator implements Iterator {
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
this.bookShelf = bookShelf;
this.index = 0;
}
public boolean hasNext() {
if (index < bookShelf.getLength()) {
return true;
} else {
return false;
}
}
public Object next() {
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
} //测试方法
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("西游记"));
bookShelf.appendBook(new Book("红楼梦"));
bookShelf.appendBook(new Book("水浒传"));
bookShelf.appendBook(new Book("三国演义")); Iterator iterator = bookShelf.iterator();
while (iterator.hasNext()) {
Book book = (Book)iterator.next();
System.out.println(book.getName());
}
}

解释

  • BookShelf相当于一个Book的集合,Aggregate接口相当于“集合操纵工具”的工具箱,BookShelf实现了Aggregate接口,就可以从工具箱里面取出集合操纵工具。

  • Iterator是集合的遍历工具,BookShelfIterator实现Iterator接口,就拥有了遍历集合的能力,经过特殊化修改,成为专门遍历BookShelf的工具。

  • 这样,我们就可以从BookShelf中取得Book集合遍历工具BookShelfIterator,使用它遍历这个BookShelf了。

原因

  • 既然是遍历一个集合,直接写一个for循环不就行了,为什么要搞这么麻烦?

  • 因为:集合可以是一个数组,也可以是一个Vector,还可以是一个list,每种的遍历方式都不一样。如果要把数组换成list来用,那么整套代码都得重写。而用了迭代器模式后,只需要改变具体的迭代方法的实现即可。

思想

  • 将通用的方法与具体的实现分离。

  • 弱化类之间的耦合,使类作为组件更容易被复用。

  • 尽量避免用具体的类来编程,优先使用抽象类和接口。

  • 说白了,写代码不要写的太具体,要抽象些...改着也好改。

《图解设计模式》读书笔记1-1 Iterator模式的更多相关文章

  1. HeadFirst设计模式读书笔记(3)-装饰者模式(Decorator Pattern)

    装饰者模式:动态地将责任附件到对象上.若要扩展功能,装饰者提东了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型 你可以用一个或者多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超 ...

  2. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  3. Head First 设计模式读书笔记(1)-策略模式

    一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...

  4. JavaScript设计模式:读书笔记(未完)

    该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...

  5. 图解http读书笔记

    以前对HTTP协议一知半解,一直不清楚前端需要对于HTTP了解到什么程度,知道接触的东西多了,对于性能优化.服务端的配合和学习中也渐渐了解到了HTTP基础的重要性,看了一些大神对HTTP书籍的推荐,也 ...

  6. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  7. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  8. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  9. C#设计模式学习笔记:(23)解释器模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8242238.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十一个模式-- ...

  10. 设计模式C++描述----20.迭代器(Iterator)模式

    一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...

随机推荐

  1. Codeforces 191C (LCA+树上差分算法)

    题面 传送门 题目大意: 给出一棵树,再给出k条树上的简单路径,求每条边被不同的路径覆盖了多少次 分析 解决这个问题的经典做法是树上差分算法 它的思想是把"区间"修改转化为左右端点 ...

  2. Reactjs 列表优化的一些心得

    前言 在应用开发中,列表是我们使用频率非常高的一种展现形式,在reactjs项目中更是如此.无处不在的使用更是需要我们小心触发性能瓶颈的深水炸弹. 下面就我最近的总结出的几点心得分享给大家,有什么问题 ...

  3. 给定两个list A ,B,请用找出 A ,B中相同的元素,A ,B中不同的元素 ??

    A.B 中相同元素:print(set(A)&set(B)) A.B 中不同元素:print(set(A)^set(B))

  4. HDU_2007

    /** *注意:输入的两个数字的大小并不确定 */ #include <iostream> #include <stdio.h> #include <string.h&g ...

  5. 搜索(BFS)---完美平方数

    完美平方数 279. Perfect Squares (Medium) For example, given n = 12, return 3 because 12 = 4 + 4 + 4; give ...

  6. 基于URL的正则匹配

    第一种的方式使用( <li><a target="_blank" href="/CC/detail/?nid={{ k}}">{{ ro ...

  7. httplib模块:(一个相对底层的http请求模块)

    httplib是一个相对底层的http请求模块,期上有专门的包装模块,如urllib内建模块,goto第三方模块,但是封装的越高就约不灵活,比如urllib模块里的请求错误是就不会返回结果页的内容,只 ...

  8. 在Eclipse-jee-neon中配置Hibernate(jbosstools)

    以下是在eclipse上安装Hibernate的插件,hibernate在编程上坚持出现,故需要在eclipse上进行如下安装. 首先把安装Hibernate插件,常用到JBoss,访问http:// ...

  9. 下载-MS SQL Server 2005(大全版)含开发人员版、企业版、标准版【转】

    中文名称:微软SQL Server 2005 英文名称:MS SQL Server 2005资源类型:ISO版本:开发人员版.企业版.标准版发行时间:2006年制作发行:微软公司地区:大陆语言:普通话 ...

  10. This page includes a password or credit card input in a non-secure context. A warning has been added

    此页面包含非安全上下文中的密码或信用卡输入.URL栏中添加了一个警告.有关更多信息,请参阅https://goo.gl/zmWq3m. 因为你的页面里面有input type是password,谷歌浏 ...