zoukankan      html  css  js  c++  java
  • 设计模式(8)

    上周六就開始写这篇博客,之后一直耽误了。到前天才開始写。今天醒的早,就把这部分整理一下。

    本文内容參考易学设计模式和马士兵的迭代器模式的视频。

    了解迭代器模式一个作用就是让你在使用 迭代器遍历集合类的时候 认为更自然。'


    一 、迭代器模式简单介绍

    【定义】 跌倒器模式提供一种顺序訪问一个聚合对象中各个元素,而又不暴露该对象的内部表示的方法。

    【原理】 主要4部分组成:迭代器角色、详细迭代器角色、容器角色和详细容器角色。

    【使用时机】当訪问一个聚合对象的内容而无需暴露它的内部表示,或者须要支持对集合对象的多种遍历。或者为

    遍历不同的聚合结构提供一个统一的接口时,就能够考虑是用迭代器模式。

    二 、实现ArrayList和linkedList的迭代器

    这里仅仅是简单实现,详细的能够看看源代码。记得csdn中有一个 兰亭风雨 的博客写有集合类源代码解析的文章。

    上代码:

    Iterator.java

    package com.chan;
    
    public interface Iterator {
    	
    	Object next();
    	boolean hasNext();
    }

    Collection.java

    package com.chan;
    
    public interface Collection {
    
    	void add(Object obj);
    	int size();
    	Iterator iterator();
    }

    Node,java

    package com.chan;
    
    
    public class Node {
    	
    	private Object data;
    	private Node next;
    	
    	public Node(Object data, Node next) {
    		super();
    		this.data = data;
    		this.next = 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;
    	}
    	
    }
    

    ArrayList.java

    package com.chan;
    public class ArrayList 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 ArrayListIterator();
    	}
    	
    	private class ArrayListIterator implements Iterator {
    		private int currentIndex = 0;
    
    		@Override
    		public boolean hasNext() {
    			if(currentIndex >= index) return false;
    			else return true;
    		}
    
    		@Override
    		public Object next() {
    			Object o = objects[currentIndex];
    			currentIndex ++;
    			return o;
    		}
    		
    	}
    }
    

    LinkedList.java

    package com.chan;
    
    public class LinkedList implements Collection {
    	Node head = null;
    	Node tail = null;
    	int size = 0;
    	public void add(Object o) {
    		Node n = new Node(o, null);
    		if(head == null) {
    			head = n;
    			tail = n;
    		}
    		tail.setNext(n);
    		tail = n;
    		size ++;
    	}
    	
    	public int size() {
    		return size;
    	}
    
    	@Override
    	public Iterator iterator() {
    		return new LinkedListIterator();
    	}
    	
    	private class LinkedListIterator implements Iterator{
    
    		private Node currentNode = head;
    		private int nextIndex = 0;//參考源代码中的写法
    		
    		@Override
    		public Object next() {
    			
    			Object data = currentNode.getData();
    			currentNode = currentNode.getNext();
    			nextIndex ++;
    			return data;
    		}
    
    		@Override
    		public boolean hasNext() {
    			
    			return nextIndex != size;
    		}
    		
    	}
    	
    	
    }
    

    Test>java

    package com.chan;
    public class Test {
    
    	public static void main(String[] args) {
    		
    		//Collection c = new ArrayList();
    		Collection c = new LinkedList();
    		
    		for(int i=0; i<15; i++){
    			c.add("test-"+i);
    		}
    		
    		System.out.println(c.size());
    		
    		Iterator it = c.iterator();
    		while(it.hasNext()) {
    			Object o = it.next();
    			System.out.print(o + " ");
    		}
    		}
    	//15
    	//test-0 test-1 test-2 test-3 test-4 test-5 test-6 test-7 test-8 test-9 test-10 test-11 test-12 test-13 test-14 
    }
    


    以上代码測试通过。


     

  • 相关阅读:
    第一篇博客
    Word2vec负采样
    Ubuntu系统为应用建立桌面快捷方式(以Pycharm为例)
    Kaggle入门Titanic——模型建立
    Kaggle入门Titanic——特征工程
    ubuntu系统theano和keras的安装
    win7系统下python安装numpy,matplotlib,scipy和scikit-learn
    ubuntu14.04环境下spyder的安装
    防止IE7,8进入怪异模式
    自定义列表
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6737587.html
Copyright © 2011-2022 走看看