浅谈23中设计模式--------2.Iterator模式

Iterator模式:提供一个方法按顺序遍历一个集合内的元素,而又不需要暴露该对象的内部表示。

主要实现:

    1 .访问一个聚合的对象,而不需要暴露对象的内部表示

  2 .支持对聚合对象的多种遍历

  3 .对遍历不同的对象,提供统一的接口。

就上代码模拟ArraList和LinkedList的增加方法add(),和迭代Iterator();

首选定义公共接口Collection:

package Iterator;

public interface Collection {

	//定义一种约束机制来约束,添加方法就叫ADD(),将对外公开的方法统一起来
	void add(Object o);
	int size();
	Iterator iterator();
}

再定义接口Iterator用于公共迭代入口:

package Iterator;

public interface Iterator {

	Object next();
	boolean hasNext();
}

然后定义ArraList

package Iterator;

public class ArraList implements Collection{

	Object[] objects=new Object[10];
	int index=0;
	public void add(Object o){
		
			
			if(index==objects.length){
				Object[] newObjects=new Object[objects.length*2];
				System.arraycopy(objects, 0, newObjects, 0, objects.length);
				objects=newObjects;
			}

			objects[index]=o;
			index++;
		
	}
	public int size(){
		return index;
	}
	public Iterator iterator(){
		 
		return new ArraListIterator();
	}
	private class ArraListIterator implements Iterator{
		private int currentIndex=0;
		@Override
		public boolean hasnNext() {
			if(currentIndex>=index) return false;
			else return true;
			
		}
		@Override
		public Object next() {
			Object o= objects[currentIndex];
			currentIndex ++;
			return o;
		}
		
		
	}

	
	
}

测试类:

package Iterator;

public class ArraListTest {
	public static void main(String[] args) {
		//ArraList al=new ArraList();
		LinkedList al=new LinkedList();
		Collection arrl=new ArraList();
		Collection link=new LinkedList();
		for(int i=0;i<18;i++){
			link.add(new Cat(i));
		}
		System.out.println(link.size());
		
		Iterator it=link.iterator();
		while(it.hasnNext()){
			Object o=it.next();
			System.out.println(o+" ");
			
		}
		
	}
	

}
package Iterator;

public class Cat {
	private int id;

	public Cat(int id) {
		super();
		this.id = id;
	}

	@Override
	public String toString() {
		return "Cat [id=" + id + "]";
	}
	

}

 LinkedList

package Iterator;

public class LinkedList implements Collection{
	Node head=null;
	Node tail=null;
	//Node data=null;
	int size=0;
	public void add(Object o){
		Node node=new Node(o,null);
		if(null==head){
			head=node;
			tail=node;
		}
		head=node;
		tail.setNext(node);
		tail=node;
		//tail.setData(node);
		size++;
	}
	public int size(){
		return size;
	}
	@Override
	public Iterator iterator() {
		return new LinkListIterator();
	}
	
	private class LinkListIterator implements Iterator{
		private int currentIndex=0;

		@Override
		public boolean hasnNext() {
			if(currentIndex>=size) return false;
			else return true;
		}
		
		@Override
		public Object next() {
			/*Object o=tail.getData();
			currentIndex ++;
			return o;*/
			return null;
		}

	}

提供Node来作为LinkedList指针;

package Iterator;

public class Node {

	private Object data;
	private Node next;
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
	public Node getNext() {
		return next;
	}
	public void setNext(Node next) {
		this.next = next;
	}
	public Node(Object data, Node next) {
		super();
		this.data = data;
		this.next = next;
	}
	
}

这样,就可以有相同的add(),和迭代方法了;

猜你喜欢

转载自blog.csdn.net/weixin_41524017/article/details/81710379