真刀实枪之迭代器模式
-
从整理项目说起
- 老板要看项目,但是有点乱,让我整理下,简单,说干就干
- 类图先上
-
代码跟上
-
IProject
package com.peng.ddq; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public interface IProject { // 老板从这里得到信息 public String getProjectInfo(); }
-
Project
package com.peng.ddq; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public class Project implements IProject { // 项目名称 private String name = ""; // 项目数量成员 private int num = 0; // 项目费用 private int cost = 0; // 构造函数,把所有老板想看的项目都放进来 public Project(String name, int num, int cost) { super(); // 赋值到成员变量中 this.name = name; this.num = num; this.cost = cost; } @Override public String getProjectInfo() { String info = ""; info += "项目名称:" + this.name + ",\t项目人数:" + this.num + ",\t项目费用:" + this.cost; return info; } }
-
Boss
package com.peng.ddq; import java.util.ArrayList; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public class Boss { public static void main(String[] args) { // 定义一个List存放项目 ArrayList<IProject> lists = new ArrayList<IProject>(); // 添加项目 lists.add(new Project("星球大战", 10, 1000200)); lists.add(new Project("超人改造", 12, 1000020)); lists.add(new Project("扭转时空", 11, 1002000)); lists.add(new Project("改造宇宙", 13, 10024000)); // 遍历项目 for (IProject iProject : lists) { System.out.println(iProject.getProjectInfo()); } } }
- 执行结果
项目名称:星球大战, 项目人数:10, 项目费用:1000200 项目名称:超人改造, 项目人数:12, 项目费用:1000020 项目名称:扭转时空, 项目人数:11, 项目费用:1002000 项目名称:改造宇宙, 项目人数:13, 项目费用:10024000
-
-
老板去看报表了,但是作为一名逻辑工作者,当然得一日三省啦,可以自己来实现Iterator接口来玩一把嘛!
- 来吧,先改类图
-
然后修改代码【其中遇到形如的是泛型,相关内容可查看JDK1.5】
-
IProject
package ddq2; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public interface IProject { // 增加项目 public void add(String name, int num, int cost); //查看项目信息 public String getProjectInfo(); //获得一个可以遍历的对象 public IProjectIterator iterator(); }
-
Project
package ddq2; import java.util.ArrayList; /** * @author kungfu~peg * @data 2017年11月24日 * @description */ public class Project implements IProject { // 项目列表 private ArrayList<IProject> lists = new ArrayList<IProject>(); // 项目名称 private String name = ""; // 项目数量 private int num = 0; // 项目价格 private int cost = 0; public Project() { super(); } // 定义一个构造函数,存储信息 private Project(String name, int num, int cost) { super(); // 赋值到成员变量当中 this.name = name; this.num = num; this.cost = cost; } @Override public void add(String name, int num, int cost) { lists.add(new Project(name, num, cost)); } public String getProjectInfo() { String info = ""; info += "项目名称:" + this.name + ",\t项目人数:" + this.num + ",\t项目费用:" + this.cost; return info; } @Override public IProjectIterator iterator() { return new ProjectIterator(lists); } }
-
IProjectIterator
package ddq2; import java.util.Iterator; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public interface IProjectIterator extends Iterator { }
-
ProjectIterator
package ddq2; import java.util.ArrayList; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public class ProjectIterator implements IProjectIterator { // 项目列表 private ArrayList<IProject> lists = new ArrayList<IProject>(); private int currentItem = 0; // 构造函数 public ProjectIterator(ArrayList<IProject> lists) { super(); this.lists = lists; } // 判断是否有下一个元素 @Override public boolean hasNext() { // 定义一个返回值 boolean b = true; if (this.currentItem >= this.lists.size() || this.lists.get(currentItem) == null) { b = false; } return b; } // 返回下一个 @Override public IProject next() { return (IProject) this.lists.get(this.currentItem++); } // 删除一个对象 @Override public void remove() { // 暂时没用到 } }
-
Boss
package ddq2; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public class Boss { public static void main(String[] args) { // 定义一个项目对象 IProject project = new Project(); // 添加项目 project.add("星球大战", 10, 1000200); project.add("超人改造", 12, 1000020); project.add("扭转时空", 11, 1002000); project.add("改造宇宙", 13, 10024000); // 遍历 IProjectIterator iterator = project.iterator(); while (iterator.hasNext()) { System.out.println(((IProject) iterator.next()).getProjectInfo()); } } }
- 执行结果
项目名称:星球大战, 项目人数:10, 项目费用:1000200 项目名称:超人改造, 项目人数:12, 项目费用:1000020 项目名称:扭转时空, 项目人数:11, 项目费用:1002000 项目名称:改造宇宙, 项目人数:13, 项目费用:10024000
-
- 来吧,先改类图
迭代器模式的定义
- Iterator Pattern
- Provide a way to access the elements of an arrregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象的各个元素,而又不需暴露该对象的内部细节)
- 迭代器是为容器服务的,那什么是容器呢?能容纳所有类型的都已称之为容器【Collection,Set等】,迭代器模式就是为解决遍历这些容器中的元素而生的。
- 通用类图
- 迭代器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交由迭代器就可以了,迭代器使用相当的频繁,看看它的各个角色
- Iterator抽象迭代器
- 负责定义访问和遍历元素的接口,而且基本上有固定的三个方法【first:获得第一个元素】【next:访问下一个元素】【isDone是否已经访问到底部】
- ConcreteIterator具体迭代器
- Aggregate抽象容器
- ConcreteAggregate具体容器
- Iterator抽象迭代器
-
通用代码
-
Iterator
package ddq3; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public interface Iterator { // 遍历下一个元素 public Object next(); // 是否已经遍历到底部 public boolean hasNext(); // 删除当前指向的元素 public boolean remove(); }
-
ConcreteIterator
package ddq3; import java.util.Vector; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public class ConcreteIterator implements Iterator { private Vector vector = new Vector(); // 定义当前的游标 public int cursor = 0; public ConcreteIterator(Vector vector) { super(); this.vector = vector; } // 返回下一个元素 @Override public Object next() { Object result = null; if (this.hasNext()) { result = this.vector.get(this.cursor++); } else { result = null; } return result; } // 判断是否有下一个元素 @Override public boolean hasNext() { if (this.cursor == this.vector.size()) { return false; } else { return true; } } @Override public boolean remove() { this.vector.remove(this.cursor); return true; } }
-
Aggregate
package ddq3; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public interface Aggregate { // 添加元素 public void add(Object object); // 减少元素 public void remove(Object object); // 由迭代器来遍历所有的元素 public Iterator iterator(); }
-
ConcreteAggregate
package ddq3; import java.util.Vector; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public class ConcreteAggregate implements Aggregate { // 容纳对象的容器 private Vector vector = new Vector(); // 增加一个元素 @Override public void add(Object object) { this.vector.add(object); } // 移除一个元素 @Override public void remove(Object object) { this.vector.remove(object); } @Override public Iterator iterator() { return new ConcreteIterator(this.vector); } }
-
Client
package ddq3; /** * @author kungfu~peng * @data 2017年11月24日 * @description */ public class Client { public static void main(String[] args) { // 声明出容器 Aggregate agg = new ConcreteAggregate(); // 产生对象数据放进去 agg.add("a"); agg.add("ab"); agg.add("abc"); agg.add("abcd"); agg.add("abcde"); agg.add("acbdef"); Iterator iterator = agg.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
- 执行结果
a ab abc abcd abcde acbdef
-
迭代器模式的应用
- for(Object o:容器){}的底层实现就是迭代器
- java.util.Iterator在JDK1.2增加,并逐渐把Iterator应用到各个聚合类(Collection)
- 现在很普遍,几乎迭代器模式要退出设计模式--因为它使用的太广泛了--Iterator的iterator方法一般就能满足你的需求
最佳实践
- 如果你是做java开发,尽量不要自己写迭代器模式~~
声明
- 摘自秦小波《设计模式之禅》第2版;
- 仅供学习,严禁商业用途;
- 代码手写,没有经编译器编译,有个别错误,自行根据上下文改正;