设计模式之二:iterator
2017-06-24 09:46
405 查看
用途:
iterator 主要是针对不同容器,对外提供具有相同操作规范的遍历。因为不同容器内部具体实现不一样,所做的迭代也是不一样,为了便于程序的可扩展性,暴露一个接口,各个容器依据具体实现提供遍历方法。代码实现:
//自定容器之一:MyArrayList public class MyArrayList { private int[] datas = new int[5]; private int size=0; public void add(int number){ if(size==datas.length){ int[] newDatas = new int[datas.length*2]; System.arraycopy(datas,0,newDatas,0,datas.length); datas =newDatas; } datas[size]=number; size++; } public int getSize(){ return size; } } //自定义容器之二:MyLinkList public class MyLinkList { private Node head = null; private Node tail = null; private int size = 0; public void add(int number){ Node newNode = new Node(number,null); if(head==null){//如果一个节点都没有,则head和tail都指向新的节点 head = newNode; tail = newNode; } tail.setNext(newNode); tail = newNode; size++; } public int getSize(){ return size; } } //Node类 public class Node { private int number; private Node next; public Node(int number, Node next) { this.number = number; this.next = next; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } } //测试类: public class Test { public static void main(String[] args) { //MyArrayList mya = new MyArrayList(); MyLinkList mya = new MyLinkList(); for(int i = 0;i<12;i++){ mya.add(i); } System.out.println(mya.getSize()); } }
从测试类中可以看出,每次我要换一个容器的时候,如果这两个容器的add和get方法不一致,代码变更量很大,所以改造之一:提供一个collection 接口,将add和
getSize方法统一在接口中:
//自定义接口:MyCollection public interface MyCollection { void add(int number); int getSize(); } //再看测试类: public static void main(String[] args) { MyCollection c = new MyLinkList(); for(int i = 0;i<12;i++){ c.add(i); } System.out.println(c.getSize()); }
现在想遍历这2个容器,可以看到由于内部具体实现不同,设计一个迭代器,不同容器提供这个迭代器供外部使用,改造开始:
//迭代器:
public interface MyIterator {
int next(); boolean hasNext();
}
//MyArrayList 提供自己的迭代器
public class MyArrayList implements MyCollection{
private int[] datas = new int[5]; private int size=0; public void add(int number){ if(size==datas.length){ int[] newDatas = new int[datas.length*2]; System.arraycopy(datas,0,newDatas,0,datas.length); datas =newDatas; } datas[size]=number; size++; } public int getSize(){ return size; } @Override public MyIterator iterator() { return new ArrayIterator(); } class ArrayIterator implements MyIterator{ int index = 0; @Override public int next() { int temp = datas[index]; index++; return temp; } @Override public boolean hasNext() { if(index>=size){ return false; }else{ return true; } } }
}
//MyCollection 新增一个提供Iterator的方法: public interface MyCollection { void add(int number); int getSize(); MyIterator iterator(); } 测试: public static void main(String[] args) { MyCollection c = new MyArrayList(); for(int i = 0;i<12;i++){ c.add(i); } MyIterator it = c.iterator(); while(it.hasNext()){ int number = it.next(); System.out.print(number+" "); } }
打印结果:0 1 2 3 4 5 6 7 8 9 10 11
相关文章推荐
- 设计模式之Iterator
- .NET设计模式-迭代器模式(Iterator Pattern)
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
- 设计模式之 迭代器(Iterator)----对象行为型模式
- 设计模式之Iterator迭代模式
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
- .Net中的设计模式——Iterator模式
- 设计模式简单代码之Iterator模式
- 设计模式之二 abstract factory模式
- .Net中的设计模式——Iterator模式
- .Net中的设计模式——Iterator模式
- [设计模式学习笔记之二]设计模式和量体剪衣
- 设计模式之Iterator——点名篇(原创)
- 设计模式笔记(9 INTERPRETER & ITERATOR)
- 设计模式之Iterator——点名篇
- 设计模式之Iterator——点名篇
- 设计模式笔记(9 INTERPRETER & ITERATOR)
- 设计模式----Iterator(迭代器)模式
- Iterator设计模式
- 设计模式(24)-迭代器模式(Iterator)