Java编程思想:泛型接口

import java.util.Iterator;
import java.util.Random;

public class Test {
    public static void main(String[] args) {
//        ATester.test();
        Tester.test();
    }
}

interface Generator<T>{
    T next();
}

class A { }
class a extends A{ }
class b extends A{ }
class c extends A{ }
class d extends A{ }

/*
    思路:
        Generator这个生成器,你可以给它指定size,当你通过迭代器
        调用它的生成方法时,你就只能生成你指定的size个元素。
 */
class ATester implements Generator<A>,Iterable<A> {

    private Class[] types = {a.class,b.class,c.class,d.class};
    private int size;
    private Random rand = new Random(47);

    public ATester() {
    }

    public ATester(int size) {
        this.size = size;
    }

    @Override
    public A next() {
        try{
            return (A)types[rand.nextInt(types.length)].newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public Iterator<A> iterator() {
        return new Iterator<A>() {
            int count = size;
            @Override
            public boolean hasNext() {
                return count>0;
            }

            @Override
            public A next() {
                count--;
                return ATester.this.next();
            }
        };
    }

    static void test() {
        ATester g = new ATester();
        for (int i = 0; i < 5; i++) {
            System.out.println(g.next());
        }
    }
}


/*
    负责生成斐波那契数列的生成器!
 */
class Fibonacci implements Generator<Integer> {
    private int pre=0,ppre=0;
    private int i=0;
    @Override
    public Integer next() {
        int result;

        i++;
        if (i <=2 ) {
            result=1;
        }else{
            result=pre+ppre;
        }

        ppre = pre;
        pre = result;

        return result;
    }
}
//这个方案计算量太多了
class Fibonacci2 implements Generator<Integer> {
    int count=0;
    private int fbi(int i) {
        if (i <= 2) {
            return 1;
        }
        return fbi(i-1)+fbi(i-2);
    }
    @Override
    public Integer next() {
        return fbi(++count);
    }
}

//编写一个适配器
class FibonacciAdaptor implements Iterable<Integer> {
    private int size;
    private Fibonacci fibonacci;

    public FibonacciAdaptor(int size, Fibonacci fibonacci) {
        this.size = size;
        this.fibonacci = fibonacci;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            //我的方案,感觉没有书中的优雅
            //int i = 0;
            @Override
            public boolean hasNext() {
                //return i<size;
                return size>0;
            }

            @Override
            public Integer next() {
                //i++;
                size--;
                return fibonacci.next();
            }
        };
    }
}
class Tester{
    static void test() {
        Fibonacci f = new Fibonacci();
        int i = 0;
        while (i < 10) {
            System.out.print(f.next()+" ");
            i++;
        }
        System.out.println();

        Fibonacci2 f2 = new Fibonacci2();
        i = 0;
        while (i < 10) {
            System.out.print(f2.next()+" ");
            i++;
        }


    }
}

猜你喜欢

转载自www.cnblogs.com/junjie2019/p/10550228.html