详解java设计模式(四)之迭代器模式(行为型)

引言:

熟悉数据库编程的同学都知道当我们需要获取数据库中的结果集合时,我们使用的是系统系统提供的迭代方法来进行数据的获取。这种设计模式就是迭代器模式。迭代器模式在我们平时使用的java集合中十分常见。如果我们访问arrayList,hashSet,hashMap等聚集对象,我们都可以通过聚集对象提供的迭代器接口来获取数据。这种设计模式本质上来说就是屏蔽了聚集对象访问的细节,提供统一的接口访问,符合开闭原则(oo)。

一.认识迭代器模式

1.迭代器模式定义:
提供一种方法顺序访问聚集对象中的各种元素,并且不暴露聚集对象的内部细节。

2.角色构成:
1)抽象迭代器角色(Iterator):
定义遍历元素所需要的方法,一般至少需要定义两个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()。有时也会有移出当前对象的方法remove(很少)

2)具体迭代器角色:
实现抽象迭代器中定义的方法,完成对一个聚集对象的访问。

3) 抽象容器角色(Aggregate):
一般是一个接口,提供集合访问的方法,至少提供一个iterator()方法,用户返回一个迭器对象,以便完成聚集对象的迭代。(例如java中Collection,List等接口)

4)具体容器角色:
抽象容器的具体实现类,如实现list接口的arrylist。

3.应用场景:
1)访问一个聚集对象的内容而无需暴露它的内部表示
2)为遍历不同的聚集结构提供一个统一的接口(如java中collection)
3)主要对聚集对象的遍历操作,即只读操作,不适合修改,写入等操作。

二.应用迭代器模式
我们前面讲过java中arraylist,hashset等聚集对象都提供了迭代接口。所以此次我们可以通过自己写一个arraylist实现类来理解迭代器模式。

1.定义迭代接口(Iterator)

public interface Iterator{
//是否遍历结束
public boolean hasNext();
//取下一个元素
public Object Next();
}

2.定义容器接口

public interface List{
//添加元素操作
public void add(T obj);
//迭代器对象
public Iterator iterator();
//访问集合元素,如果越界则报异常
public T get(int index) throw Exception;
#返回集合大小
public int size();
}

3.具体迭代器类
迭代器含有一个容器类的引用,才能访问容器类的数据

public class myIterator{
public List list;
public int index=0;
//通过构造函数传入容器类
public myIterator(List list){
this.list=list;
}
//是否遍历结束
public boolean hasNext(){
if(index<list.size())
return true;
return false;
}
//是否含有下一个元素
public Object Next(){
Object c=null;
try{ c=list.get(index)}
catch(Exception ){
return null;
}
index++;
return c;
}
}

4.具体容器类(实现arraylist,动态数组)

pulic customList implements List{
//容器
private Object array=null;
//容器大小
private int currentSize=0;
//索引
private int index=0;
//默认构造
public customList(){
//默认为3
currentSize=3;
array=new Object[currentSize];
}
//指定大小
public customList(int size){
currentSize=size;
array=new Ojbect[currentSize];
}
@override
public void add(Object c){
//如果数组越界限
if(index>=currentSize){
//数组动态扩充
Object[]new_array=new Object[currentSize*2];
System.arraycopy(array,0,new_array,currentSize);
currentSize*=2;
array=new_array;
}
array[index++]=c;
}
//返回相应的迭代器
@override
public Iterator iterator(){
//构造迭代器,并将容器类传入迭代器中
return new myIterator(this);
}
//访问元素
@override
public Object get(int index){
if(index<currentSize)
return datas[index];
throw new Exception("访问越界")
}
//容器大小
public int size(){
return currentSize;
}
}

5.客户端

public class test(){
public void main(String []args){
customList list=new customList();
list.add(1);
list.add(2);
list.add(3);
System.out.println("size:"+list.size());
//默认容器大小为3,触发容器动态扩充
list.add(4);
System.out.println("size:"+list.size());
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println("element:"+it.next());
}
}
}
程序结果如下:
size:3
size:6
element:1
element:2
element:3
element:4
element:null
element:null

三.感悟与收获
我们终于动手完成了arraylist类的设计与实现,我们不仅对arraylist的原理有了深入的掌握,也使得我们对迭代器模式有了更深的认识。其实学习过前面集中设计模式之后我们会发现java设计模式本质上是利用了java类的继承,接口,多态等特性来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值