导读:一、模式动机.迭代器模式(Iterator Pattern)是一种使用频率非常高的行为型设计模式,迭代器 用于对一个聚合对象进行遍历.。通过引入迭代器 可以将数据的遍历功能从聚合对象中分离出来 ,聚合对象只负责存储数据 ,而遍历数据由迭代器来完成.,简化了聚合对象的设计,更符合“
迭代器模式(Iterator Pattern)是一种使用频率非常高的行为型设计模式,迭代器 用于对一个聚合对象进行遍历
。通过引入迭代器 可以将数据的遍历功能从聚合对象中分离出来 ,聚合对象只负责存储数据 ,而遍历数据由迭代器来完成
,简化了聚合对象的设计,更符合“单一职责原则”的要求。Java语言提供了对迭代器模式的完美支持,通常我们不需要自己定义新的迭代器,直接使用Java提供的迭代器即可。迭代器模式又称为“游标(Cursor)模式”,它是一种对象行为型模式。
类比:
抽象迭代器类
public interface Iterator {
public void first(); //将游标指向第一个元素
public void next(); //将游标指向下一个元素
public boolean hasNext(); //判断是否存在下一个元素
public Object currentItem(); //获取游标指向的当前元素
}
具体迭代器类
public class ConcreteIterator implements Iterator {
private ConcreteAggregate objects; //维持一个对具体聚合对象的引用,以便于访问存储在聚合对象中的数据
private int cursor; //定义一个游标,用于记录当前访问位置
public ConcreteIterator(ConcreteAggregate objects) {
this.objects=objects;
}
public void first() { ...... }
public void next() { ...... }
public boolean hasNext( ) { ...... }
public Object currentItem( ) { ...... }
}
抽象聚合类
public interface Aggregate {
Iterator createIterator( );
}
具体聚合类
public class ConcreteAggregate implements Aggregate {
......
public Iterator createIterator( ) {
return new ConcreteIterator(this);
}
......
}
遥控操控电视频道遍历
抽象迭代器类:电视机遥控器类
public interface TVInterator {
void setChannel(int i);
Object currentChannel();
void next();
void previous();
boolean isLast();
boolean isFirst();
}
抽象聚合类
public interface Television {
TVInterator createInterator();
}
具体电视机类:创维电视机类
public class SkyworthTelevision implements Television{
private Object[] obj = {"CCTV-1","CCTV-2","CCTV-3","CCTV-4","CCTV-5","CCTV-6"};
@Override
public TVInterator createInterator() {
return new SkyworthInterator(obj);
}
}
具体电视机类:TCL
public class TCLTelevision implements Television{
private Object[] obj = {"湖南卫视","上海卫视","山西卫视","河北卫视","上海卫视","北京卫视"};
@Override
public TVInterator createInterator() {
return new SkyworthInterator(obj);
}
}
具体电视机遥控器类:创维
public class SkyworthInterator implements TVInterator{
private int currentIndex = 0;
private Object obj[];
public SkyworthInterator(Object[] obj) {
this.obj = obj;
}
@Override
public void setChannel(int i) {
currentIndex = i;
}
@Override
public Object currentChannel() {
return obj[currentIndex];
}
@Override
public void next() {
if (currentIndex < obj.length){
currentIndex ++;
}
}
@Override
public void previous() {
if (currentIndex > 0){
currentIndex --;
}
}
@Override
public boolean isLast() {
return currentIndex == obj.length;
}
@Override
public boolean isFirst() {
return currentIndex ==0;
}
}
具体电视机遥控器类:TCL
public class TCLInterator implements TVInterator{
private int currentIndex = 0;
private Object obj[];
public TCLInterator(Object[] obj) {
this.obj = obj;
}
@Override
public void setChannel(int i) {
currentIndex = i;
}
@Override
public Object currentChannel() {
return obj[currentIndex];
}
@Override
public void next() {
if (currentIndex < obj.length){
currentIndex ++;
}
}
@Override
public void previous() {
if (currentIndex > 0){
currentIndex --;
}
}
@Override
public boolean isLast() {
return currentIndex == obj.length;
}
@Override
public boolean isFirst() {
return currentIndex ==0;
}
}
客户类
public class Client {
public static void display(Television tv){
TVInterator interator = tv.createInterator();
System.out.println("电视机频道:");
while (!interator.isLast()){
System.out.println(interator.currentChannel().toString());
interator.next();
}
}
public static void reverseDisplay(Television tv){
TVInterator interator = tv.createInterator();
interator.setChannel(6);
System.out.println("逆向遍历电视机频道:");
while (!interator.isFirst()){
interator.previous();
System.out.println(interator.currentChannel().toString());
}
}
public static void main(String a[]) {
Television tv = (Television) XMLUtil.getBean();
display(tv);
System.out.println("===============");
reverseDisplay(tv);
}
}
上一篇:百度网盘(百度云)SVIP超级会
下一篇:VSCode中的快捷键