适用:访问一个聚合对象得内容而无须暴露它得内部表示。将聚合对象的访问与内部数据的存储分离,使得访问聚合对象时无须了解其内部的实现细节。需要为聚合对象提供多种遍历方式。为遍历不同聚合结构提供统一的接口。如:遥控器和电视
迭代器模式是一种使用频率非常高的设计模式,迭代器用于对一个聚合对象进行遍历。怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,海能提供不同的遍历方式,这就是迭代器模式所要解决的问题。
定义:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标。
模式结构图:
角色:
Iterator:抽象迭代器
ConcreteIterator:具体迭代器
Aggregate:抽象聚合类
ConcreteAggregate:具体聚合类
聚合是一个管理和组织数据对象的数据结构。这就表明聚合首先应具备一个基本功能,即存储数据,这其中包含存储数据的类型,存储空间的大小,存储空间的分配,以及存储的方式和顺序。如果不具备这些特点,则该对象就不能称为聚合对象。
因此,聚合对象主要有两个职责:一是存储内部数据;而是遍历内部数据。但是前者时聚合对象的基本功能,而后者是可以分离的。因此,我们将遍历聚合对象中的行为提取出来,封装到一个迭代器中,通过专门的迭代器来遍历聚合对象的内部数据。
代码实现(外部类):
客户端:
聚合类接口:
package com.iterator.hing;
public interface Television {
public TVController createIterator();
}
迭代器接口(抽象迭代器):
package com.iterator.hing;
public interface TVController {
public void setChannel(int i);
public Object currentChannel();
public void next();
public void previous();
public boolean isLast();
public boolean isFirst();
}
具体聚合类1:
package com.iterator.hing;
public class HaierTV implements Television {
private Object[] obj = {"1.四川卫视","2.经济频道","3.浙江卫视","4.CCTV-6","5.峨嵋电影频道","6.湖南卫视"};
public Object[] getObj() {
return obj;
}
public void setObj(Object[] obj) {
this.obj = obj;
}
@Override
public TVController createIterator() {
// TODO Auto-generated method stub
return null;
}
}
具体迭代器1:
package com.iterator.hing;
public class HaierController implements TVController {
private Object[] obj;
//注意,此处也可以直接是聚合的对象,这样更好的体现聚合性。
public HaierController(HaierTV ht) {
this.obj = ht.getObj() ;
}
public HaierController() {
}
private int currentIndex = 0;
@Override
public void setChannel(int i) {
currentIndex = i;
}
@Override
public Object currentChannel() {
// TODO Auto-generated method stub
if(obj.length - 1 >= currentIndex) {
return obj[currentIndex];
}
return null;
}
@Override
public void next() {
if(currentIndex + 1 >= obj.length ) {
currentIndex = 0;
}else {
currentIndex ++;
}
}
@Override
public void previous() {
if(currentIndex - 1 >= 0 ) {
currentIndex --;
}else {
currentIndex = obj.length - 1;
}
}
@Override
public boolean isLast() {
if(currentIndex == obj.length - 1)
return true;
return false;
}
@Override
public boolean isFirst() {
if(currentIndex == 0)
return true;
return false;
}
}
具体聚合类2:
//和具体聚合类1类似
具体迭代器2:
//和具体迭代器1类似
此处还可使用内部类的方式来实现,即将迭代器写入到具体聚合类中去,那样可以简化一部分代码。