ITERATOR 迭代子模式

迭代子模式:可以顺序的访问一个聚集中的元素而不必暴露聚集的内部表象


如果聚集的接口提供了可以用来修改聚集元素的方法,这个接口就是所谓的宽接口。这种提供宽接口的聚集叫  “白箱聚集”,这时候的迭代子叫游标迭代子或 外禀迭代子。



改良的设计 :


在Java语言中,实现双重接口的办法就是将迭代子类设计成聚集类的内部成员类,这样迭代子对象就可以像聚集对象的内部成员一样访问聚集对象的内部结构了。这种同时保证聚集对象的封装和迭代子功能的实现的方案叫做 "黑箱"实现方案. 这时候的迭代子在 聚集的内部,因此又叫 “内禀迭代子"


(1)  白箱聚集  和  外禀迭代子



/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 14:23:30
 * <p/>
 * note: 白盒聚集与外禀迭代子 聚集角色
 */
abstract public class Aggregate {

    /**
     * 迭代子模式要求 聚集对象 必须有一个 工厂方法
     * 向外界提供迭代子对象实例
     * @return
     */
    public Iterator createIterator() {
        return null;
    }
}



/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 14:24:04
 * <p/>
 * note: 白盒聚集与外禀迭代子 具体聚集角色
 */
public class ConcreteAggregate extends Aggregate {
    private Object objs[]= {"Monk Tang",
        "Monkey", "Pigsy",
        "Sandy", "Horse"};

    /**
     *
     * @return
     */
    public Iterator createIterator() {
        return new ConcreteIterator(this);
    }

    /*
     * 白箱聚集向外界提供了访问自己内部元素的接口
     * 从而使外禀迭代子调用这个方法实现 迭代
     */
    public Object getElement(int index) {
        if (index < objs.length) {
            return objs[index];
        } else {
            return null;
        }
    }

    public int size() {
        return objs.length;
    }
}


/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 14:25:12
 * <p/>
 * note: 白盒聚集与外禀迭代子: 迭代子角色
 */
public interface Iterator {
    void first();
    void next();
    boolean isDone();
    Object currentItem();
}


/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 14:26:16
 * <p/>
 * note: 白盒聚集与外禀迭代子: 具体迭代子角色
 *
 *       由于迭代的逻辑是由 聚集对象本身提供的,所以这样的外禀迭代子往往仅仅保持迭代游标的位置
 */
public class ConcreteIterator implements Iterator {
    private ConcreteAggregate agg;
    private int index = 0;
    private int size = 0;

    public ConcreteIterator(ConcreteAggregate agg) {
        this.agg = agg;
        size = agg.size();
        index = 0 ;
    }

    public void first() {
        index = 0 ;
    }

    public void next() {
        if (index < size) {
            index++;
        }
    }

    public boolean isDone() {
        return (index >= size);
    }

    /**
     * 外禀迭代子通过调用白箱聚集提供的 接口
     * 实现迭代
     * @return
     */
    public Object currentItem() {
        return agg.getElement(index);
    }
}


/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 14:21:50
 * <p/>
 * note: 白盒聚集与外禀迭代子 客户端角色
 */
public class Client {
    private Iterator it;
    private Aggregate agg = new ConcreteAggregate();

    public static void main(String[] args) {
        Client client = new Client();
        client.operation();
    }

    public void operation() {
        it = agg.createIterator();
        while( !it.isDone() ) {
            System.out.println(it.currentItem().toString());
            it.next();
        }
    }
}

(2)  黑箱聚集和内禀迭代子

/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 14:51:39
 * <p/>
 * note: 黑箱聚集和内禀迭代子 : 迭代子角色
 */
public interface Iterator {
    void first();
    void next();
    boolean isDone();
    Object currentItem();

}



/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 14:52:19
 * <p/>
 * note: 黑箱聚集和内禀迭代子 : 聚集角色
 */
abstract public class Aggregate {

    public Iterator createIterator() {
        return null;
    }

}



/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 14:52:54
 * <p/>
 * note: 黑箱聚集和内禀迭代子 : 具体聚集角色
 *        这时候 聚集角色没有向 外界 提供 遍历方法
 */
public class ConcreteAggregate extends Aggregate {
    private Object[] objs = {"Monk Tang", "Monkey", "Pigsy", "Sandy", "Horse"};

    public Iterator createIterator() {
        return new ConcreteIterator();
    }

    /**
     * 具体迭代子角色是 具体聚集角色的内部类
     * 因此叫内禀迭代子
     */
    private class ConcreteIterator implements Iterator {
        private int currentIndex = 0;

        public void first() {
            currentIndex = 0;
        }

        public void next() {
            if (currentIndex < objs.length) {
                currentIndex++;
            }
        }

        public boolean isDone() {
            return (currentIndex == objs.length);
        }

        public Object currentItem() {
            return objs[currentIndex];
        }
    }
}



/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 14:52:04
 * <p/>
 * note: 黑箱聚集和内禀迭代子 : 客户角色
 */
public class Client {
    private Iterator it;
    private Aggregate agg = new ConcreteAggregate();

    public void operation() {
        it = agg.createIterator();
        while( !it.isDone() ) {
            System.out.println(it.currentItem().toString());
            it.next();
        }
    }

    public static void main(String[] args) {
        Client client = new Client();
        client.operation();
    }
}


如果一个聚集的接口没有提供修改聚集元素的方法,这个接口就是所谓的窄接口
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值