迭代器模式
2016-03-20 21:07
295 查看
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
具体迭代器类
抽象容器(接口)
具体容器类
场景类
项目信息的接口
项目信息的具体实现类
场景类
项目信息接口
项目信息具体实现类
定义自己的迭代器接口
定义自己的迭代器接口的具体实现
场景类
迭代器模式的通用类图
迭代器模式的通用源码
抽象迭代器(接口)public interface Iterator { //遍历下一个元素 public Object next(); //是否已经遍历到尾部 public boolean hasNext(); //删除当前指向的元素 public boolean remove(); }
具体迭代器类
public class ConcreteIterator implements Iterator { private Vector<Object> vector = new Vector<>(); //定义当前的游标 private int cursor = 0; public ConcreteIterator(Vector<Object> _vector) { 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; } }
抽象容器(接口)
public interface Aggregate { //是容器必然有元素的增加 public void add(Object object); //减少元素 public void remove(Object object); //由迭代器来遍历所有的元素 public Iterator iterator(); }
具体容器类
public class ConcreteAggregate implements Aggregate { private Vector<Object> vector = new Vector<Object>(); @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(vector); } }
场景类
public class Client { public static void main(String[] args) { //声明出容器 Aggregate aggregate = new ConcreteAggregate(); //产生对象数据放进去 aggregate.add("abc"); aggregate.add("ass"); aggregate.add("121"); //遍历 Iterator iterator = aggregate.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }
迭代器模式的应用
从事java开发,就不需要自己写迭代器模式了,Java本省提供的Iterator一般都能满足开发的需要。迭代器模式的简单应用
迭代器模式的简单应用前奏—类图及源码
项目信息的接口
public interface IProject { //获取项目的信息 public String getProjectInfo(); }
项目信息的具体实现类
public class Project implements IProject { //项目的名字 private String name = ""; //项目成员数量 private int num = 0; //项目费用 private int cost = 0; //定义一个构造函数,把所有的项目信息存储下来 public Project(String _name, int _num, int _cost) { this.name = _name; this.num = _num; this.cost = _cost; } @Override public String getProjectInfo() { String info = ""; info = info + "项目名称:" + this.name; info = info + "/t项目成员数:" + this.num; info = info + "/t项目费用:" + this.cost; return info; } }
场景类
public class Client { public static void main(String[] args) { ArrayList<IProject> list = new ArrayList<IProject>(); for (int i = 0; i < 20; i++) { list.add(new Project("hello" + i, i * 2, i * 2500)); } for (IProject project : list) { System.out.println(project.getProjectInfo()); } } }
迭代器模式的简单应用—类图及源码
项目信息接口
public interface IProject { //增加项目 public void add(String name, int num, int cost); //项目的全部信息 public String getProjectInfo(); //获得一个可以被遍历的对象 public IProjectIterator iterator(); }
项目信息具体实现类
public class Project implements IProject { //定义一个项目列表,将所有的项目都放入其中 private ArrayList<IProject> list = new ArrayList<IProject>(); //项目名称 private String name = ""; //项目成员数量 private int num = 0; //项目费用 private int cost = 0; public Project() { } //定义构造函数,把所有的项目信息存储起来 public Project(String _name, int _num, int _cost) { this.name = _name; this.num = _num; this.cost = _cost; } @Override public void add(String name, int num, int cost) { this.list.add(new Project(name, num, cost)); } @Override public String getProjectInfo() { String info = ""; info = "项目名称:" + this.name; info = info + "\t项目成员数:" + this.num; info = info + "\t项目费用:" + this.cost; return info; } @Override public IProjectIterator iterator() { return new ProjectIterator(this.list); } }
定义自己的迭代器接口
public interface IProjectIterator extends Iterator<Object> { //不用做任何事情 }
定义自己的迭代器接口的具体实现
public class ProjectIterator implements IProjectIterator { //将所有的项目放入到ArrayList中 private ArrayList<IProject> list = new ArrayList<IProject>(); private int currentItem = 0; //构造函数传入ArrayList中 public ProjectIterator(ArrayList<IProject> _list) { this.list = _list; } @Override public boolean hasNext() { boolean b = true; if (this.currentItem >= list.size() || this.list.get(currentItem) == null) { b = false; } return b; } @Override public Object next() { return this.list.get(this.currentItem++); } @Override public void remove() { } }
场景类
public class Client { public static void main(String[] args) { IProject project = new Project(); for (int i = 0; i < 20; i++) { project.add("hello" + i, i * 2, i * 2500); } IProjectIterator iterator = project.iterator(); while (iterator.hasNext()) { IProject p = (IProject) iterator.next(); System.out.println(p.getProjectInfo()); } } }
相关文章推荐
- 数据库-mongodb-常用命令
- 二分查找
- Python出现TypeError: file() argument 1 must be encoded string without NULL bytes, not str问题解决
- eclipse通过maven插件添加Jersey archetype
- 一次内存错误调试总结(平台Cortex-M3)
- HTML基础2 表单和框架
- 入门训练 圆的面积
- POJ-1273 Drainage Ditches(最大流)
- 模拟分析
- (Leetcode 142)Linked List Cycle (II) (快慢指针详解)
- 机电传动控制第四周作业
- serialVersionUID要注意以下几点:
- 第五章读书笔记——系统调用
- Android4.4以上改变状态栏颜色的几种实现方式
- Largest palindrome product
- String深拷贝、比较及增删查改等操作
- 网易2016研发工程师编程题①
- 利用c语言宏#的用法打日志并统计错误
- andorid资源动画学习
- 【matlab】:图像获得其边缘