以繼承的硬編碼方式實現的代理

package question3;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*
 * 	寫一個ArrayList類的代理,其內部實現和ArrayList中完全相同的功能,
 * 	並可以計算每個方法運行的時間。
 * 
 *  解題方式一
 *  1.通過實現一個List接口來獲得ArrayList的List代理功能
 *  2.爲每一個list接口的方法實現代理調用
 *  3.爲每一個list接口的方法輸出運行時間,單位爲納秒ns
 *  4.測試每一個方法的調用耗時
 *  
 *  優點:拋棄了傳統的繼承覆蓋機制,更靈活的代理和目標代碼
 *  	   轉換
 *  缺點:該方式會使代碼量成倍遞增,維護不便
 *  
 *  注:1秒=1 000 000 000納秒 jdk api中以毫微秒錶示納秒
 */
public class ArrayListProxy_1<E> implements List<E>
{
	/**
	 * 此代理的目標ArrayList,該成員只有代理類
	 * 可以持有,所以不應該暴露給用戶,而是私有
	 */
	private ArrayList<E> list = new ArrayList<E>();
	/**
	 * 緩衝的耗時變量,用來統計方法的耗時
	 * 單位爲納秒(毫微秒)
	 * 
	 * 該變量的提升方式在多線程環境會產生錯誤
	 * 並導致時間不準確,多線程中應該使其局部化
	 */
	private long taken;
	
	public static void main(String[] args)
	{
		/*
		 * 頂一個ArrayList實現的cellection實例,
		 * 並用來測試該代理的參數爲cellection的方法
		 * 也用來保證集合中有效元素的個數
		 */
		ArrayList<String> arrayList = new ArrayList<String>();
		arrayList.add("a");
		arrayList.add("b");
		arrayList.add("c");
		
		/*
		 * 創建一個代理List,該實現可以以config的方法進行配置
		 * 實現代理和真實目標的轉換
		 * 
		 * 但是該方式無法實現ArrayList的本地方法調用,只能實現
		 * ArrayList上層接口的方法調用
		 */
		List<String> list = new ArrayListProxy_1<String>();
		list.size();
		list.isEmpty();
		list.contains("zhangsan");
		list.iterator();
		list.toArray();
		list.toArray(new String[]{});
		list.add("wangwu");
		list.remove("lisi");
		list.containsAll(arrayList);
		list.addAll(arrayList);
		list.indexOf("a");
		list.lastIndexOf("c");
		list.addAll(0,arrayList);
		list.get(0);
		list.set(0, "loli");
		list.removeAll(arrayList);
		list.retainAll(arrayList);
		list.clear();
		list.add(0, "tom");
		list.remove(0);
		list.listIterator();
		list.listIterator(0);
		list.subList(0, 00);
	}
	
	/*
	 * 爲每一個方法編寫代理方式,並實現
	 * 以單位爲納秒的精確時間統計
	 * System.currentTimeMillis()在
	 * 精度上會有損失,低於100毫秒時,
	 * 精度會有+5 -5之間的偏差
	 * 
	 * After here, the other methods look like the same
	 * 後邊的不用看了。。。都一樣的
	 */
	@Override
    public int size()
    {
		int returnValue;
		taken = System.nanoTime();
		returnValue = list.size();
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".size() -> "+this.list.getClass().getName()+".size() times taken by "+taken+" ns");
	    return returnValue;
    }

	@Override
    public boolean isEmpty()
    {
		boolean returnValue;
		taken = System.nanoTime();
		returnValue = list.isEmpty();
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".isEmpty() -> "+this.list.getClass().getName()+".isEmpty() times taken by "+taken+" ns");
	    return returnValue;
    }

	@Override
    public boolean contains(Object o)
    {
		boolean returnValue;
		taken = System.nanoTime();
		returnValue = list.contains(o);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".contains(Object) -> "+this.list.getClass().getName()+".contains(Object) times taken by "+taken+" ns");
	    return returnValue;
    }

	@Override
    public Iterator<E> iterator()
    {
		Iterator<E> iterator;
		taken = System.nanoTime();
		iterator = list.iterator();
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".iterator() -> "+this.list.getClass().getName()+".iterator() times taken by "+taken+" ns");
	    return iterator;
    }

	@Override
    public Object[] toArray()
    {
		Object[] objs;
		taken = System.nanoTime();
		objs = list.toArray();
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".toArray() -> "+this.list.getClass().getName()+".toArray() times taken by "+taken+" ns");
	    return objs;
    }

	
	@Override
    public <T> T[] toArray(T[] a)
    {
		T[] objs;
		taken = System.nanoTime();
		objs = list.toArray(a);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".toArray(T[]) -> "+this.list.getClass().getName()+".toArray(T[]) times taken by "+taken+" ns");
	    return objs;
    }

	@Override
    public boolean add(E e)
    {
		boolean returnValue;
		taken = System.nanoTime();
		returnValue = list.add(e);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".add(E) -> "+this.list.getClass().getName()+".add(E) times taken by "+taken+" ns");
	    return returnValue;
    }

	@Override
    public boolean remove(Object o)
    {
		boolean returnValue;
		taken = System.nanoTime();
		returnValue = list.remove(o);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".remove(Object o) -> "+this.list.getClass().getName()+".remove(Object o) times taken by "+taken+" ns");
	    return returnValue;
    }

	@Override
    public boolean containsAll(Collection<?> c)
    {
		boolean returnValue;
		taken = System.nanoTime();
		returnValue = list.containsAll(c);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".containsAll(Collection) -> "+this.list.getClass().getName()+".containsAll(Collection) times taken by "+taken+" ns");
	    return returnValue;
	}

	@Override
    public boolean addAll(Collection<? extends E> c)
    {
		boolean returnValue;
		taken = System.nanoTime();
		returnValue = list.addAll(c);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".addAll(Collection) -> "+this.list.getClass().getName()+".addAll(Collection) times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public boolean addAll(int index, Collection<? extends E> c)
    {
		boolean returnValue;
		taken = System.nanoTime();
		returnValue = list.addAll(index,c);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".addAll(int,Collection) -> "+this.list.getClass().getName()+".addAll(int,Collection) times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public boolean removeAll(Collection<?> c)
    {
		boolean returnValue;
		taken = System.nanoTime();
		returnValue = list.removeAll(c);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".removeAll(Collection) -> "+this.list.getClass().getName()+".removeAll(Collection) times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public boolean retainAll(Collection<?> c)
    {
		boolean returnValue;
		taken = System.nanoTime();
		returnValue = list.retainAll(c);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".retainAll(Collection) -> "+this.list.getClass().getName()+".retainAll(Collection) times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public void clear()
    {
		taken = System.nanoTime();
		list.clear();
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".clear() -> "+this.list.getClass().getName()+".clear() times taken by "+taken+" ns");
    }

	@Override
    public E get(int index)
    {
		E returnValue;
		taken = System.nanoTime();
		returnValue = list.get(index);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".get(int) -> "+this.list.getClass().getName()+".get(int) times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public E set(int index, E element)
    {
		E returnValue;
		taken = System.nanoTime();
		returnValue = list.set(index,element);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".set(int,E) -> "+this.list.getClass().getName()+".set(int,E) times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public void add(int index, E element)
    {
		taken = System.nanoTime();
		list.add(index,element);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".add(int,E) -> "+this.list.getClass().getName()+".add(int,E) times taken by "+taken+" ns");
    }

	@Override
    public E remove(int index)
    {
		E returnValue;
		taken = System.nanoTime();
		returnValue = list.remove(index);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".remove(int) -> "+this.list.getClass().getName()+".remove(int) times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public int indexOf(Object o)
    {
		int returnValue;
		taken = System.nanoTime();
		returnValue = list.indexOf(o);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".indexOf(Object) -> "+this.list.getClass().getName()+".indexOf(Object) times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public int lastIndexOf(Object o)
    {
		int returnValue;
		taken = System.nanoTime();
		returnValue = list.lastIndexOf(o);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".lastIndexOf(Object) -> "+this.list.getClass().getName()+".lastIndexOf(Object) times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public ListIterator<E> listIterator()
    {
		ListIterator<E> returnValue;
		taken = System.nanoTime();
		returnValue = list.listIterator();
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".listIterator() -> "+this.list.getClass().getName()+".listIterator() times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public ListIterator<E> listIterator(int index)
    {
		ListIterator<E> returnValue;
		taken = System.nanoTime();
		returnValue = list.listIterator(index);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".listIterator(int) -> "+this.list.getClass().getName()+".listIterator(int) times taken by "+taken+" ns");
		return returnValue;
    }

	@Override
    public List<E> subList(int fromIndex, int toIndex)
    {
		List<E> returnValue;
		taken = System.nanoTime();
		returnValue = list.subList(fromIndex,toIndex);
		taken = System.nanoTime()- taken;
		System.out.println(getClass().getName()+".subList(int,int) -> "+this.list.getClass().getName()+".subList(int,int) times taken by "+taken+" ns");
		return returnValue;
    }
}

發佈了49 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章