博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ITERATOR 迭代子模式
阅读量:4220 次
发布时间:2019-05-26

本文共 3892 字,大约阅读时间需要 12 分钟。

迭代子模式:可以顺序的访问一个聚集中的元素而不必暴露聚集的内部表象
如果聚集的接口提供了可以用来修改聚集元素的方法,这个接口就是所谓的宽接口。这种提供宽接口的聚集叫  “白箱聚集”,这时候的迭代子叫游标迭代子或 外禀迭代子。
改良的设计 :
在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();
    }
}

如果一个聚集的接口没有提供修改聚集元素的方法,这个接口就是所谓的窄接口

转载地址:http://bnlmi.baihongyu.com/

你可能感兴趣的文章
使用littlefs-fuse在PC端调试littlefs文件系统
查看>>
Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比
查看>>
32位与64位Linux系统下各类型长度对比
查看>>
Git-用 cherry-pick 挑好看的小樱桃
查看>>
一个可以提高开发效率的命令:cherry-pick
查看>>
其他软件中快捷键ctrl+shift+f会打开印象笔记
查看>>
解决github网站打开慢的问题
查看>>
KEIL 在编译的时候优化设置问题
查看>>
gcc 编译优化指南
查看>>
gcc的三级优化到底优化了哪些
查看>>
Keil MDK生成LIB库以及使用LIB库
查看>>
keil优化等级影响STM32 GPIO速度变化
查看>>
单片机系统重写printf函数
查看>>
C语言可变参数函数实现原理解析 - 重写printf
查看>>
STM32的printf函数重定向
查看>>
如何将有符号数转化为BCD码?
查看>>
负数取绝对值时小心越界:如Math.abs(-2147483648)
查看>>
字符串切割函数strtok、strtok_s、strtok_r的区别
查看>>
win的powershell下使用mingw编译慢的问题
查看>>
C++ 清空队列(queue)的几种方法
查看>>