以继承的硬编码方式实现的代理

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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章