ITERATOR 迭代子模式
来源:互联网 发布:中国安检有多严格 知乎 编辑:程序博客网 时间:2024/05/16 06:35
如果聚集的接口提供了可以用来修改聚集元素的方法,这个接口就是所谓的宽接口。这种提供宽接口的聚集叫 “白箱聚集”,这时候的迭代子叫游标迭代子或 外禀迭代子。
改良的设计 :
在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();
}
}
- 迭代子(Iterator)模式:
- ITERATOR 迭代子模式
- 迭代子模式(Iterator)
- 迭代子模式(Iterator)
- 迭代子模式(Iterator)
- 迭代子模式(Iterator)
- 16、迭代子模式(Iterator)
- 16、迭代子模式(Iterator)
- 16、迭代子模式(Iterator)
- Java与模式 迭代子模式 Iterator Pattern
- JAVA--迭代子模式(Iterator)--设计模式十六
- 设计模式二(迭代子模式 Iterator)
- 设计模式之迭代子模式(Iterator)
- Iterator模式
- Iterator模式
- Iterator模式
- Iterator模式
- Iterator模式
- 在WinForm应用程序中实现自动升级
- iic 学习1
- Big Decisions
- poj 题目的简单分类(转)
- hadoop中的Partitioner分区
- ITERATOR 迭代子模式
- 偶有感想
- 字符串处理函数学习整理之二 strcat
- 在VC++ 6.0 或 Visual Studio中设置包含链接库lib文件(无法解析的外部符号 __imp__WSAStartup 的解决方案)
- linux驱动之--fops的关联
- flexlib开源组件库
- 天龙八部二进制文件 读写序列化类
- 子网掩码的作用
- 论坛?疑惑不解的