设计模式之迭代器模式1
迭代器模式的定义是 通过提供一种方法顺序访问一个聚合对象中的各个元素,而又不必暴露该聚合对象中的内部表示。迭代器模式是针对聚合对象(数组、集合、链表)的“访问”而来。通过定义不同的遍历策略来遍历聚合对象。
应用场景
如果希望提供访问一个聚合对象的内容,但又不想暴露它的内部表示的时候可使用迭代器模式
如果希望有多种遍历方式可以访问聚合对象。
如果希望为遍历不同的聚合对象提供一个统一的接口,可以使用迭代器模式(多态迭代)。
迭代器模式中涉及的角色:
抽象迭代器角色(Iterator):此抽象角色定义出遍历元素的接口方法;
具体迭代器角色(ConcreteIterator):实现具体的迭代方法,继承或实现Iterator。
聚集角色(Aggregate):定义聚集对象的抽象,并定义出具体的遍历接口返回Iterator类型
具体聚集角色(ConcreteAggregate):实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。
案例演示
首先创建迭代器Iterator接口
/**
* 定义迭代器角色
* @author Iflytek_dsw
*
*/
interface Iterator {
/**
* 获取第一个元素
* @return
*/
String first();
/**
* 获取最后一个元素
* @return
*/
String last();
/**
* 判断是否有下一个元素
* @return
*/
boolean hasNext();
/**
* 下一个元素
* @return
*/
String next();
}
在Iterator接口中定义了聚集对象需要的遍历操作。
定义抽象聚集对象
/**
* 聚集角色,定义聚集角色具备的接口
* @author Iflytek_dsw
*
*/
abstract class Aggregate {
abstract Iterator iterator();
}
定义具体聚集对象
class ConcreteAggregate extends Aggregate{
private List names;
public ConcreteAggregate(List names) {
super();
this.names = names;
}
@Override
Iterator iterator() {
return new AggregateIterator(this);
}
public String first(){
return names == null ? null : names.get(0);
}
public String last(){
return names == null ? null : names.get(names.size() -1);
}
public String next(int index){
return names == null ? null : names.get(index);
}
/**
* 聚集中的元素个数
* @return
*/
public int size(){
return names.size();
}
}
在上面的实例中,我们可以看到在具体聚集中,我们定义了与Iterator对象的方法,用来封装具体的操作。以便在Iterator的具体实例中进行调用,同时我们也封装了一个生成Iterator的方法。
具体迭代器
class AggregateIterator implements Iterator{
private ConcreteAggregate concreteAggregate;
private int index;大连无痛人流哪家好 http://mobile.120wtrlyy.com/
public AggregateIterator(ConcreteAggregate concreteAggregate) {
super();
this.concreteAggregate = concreteAggregate;
this.index = 0;
}
@Override
public String first() {
return concreteAggregate.first();
}
@Override
public String last() {
return concreteAggregate.last();
}
@Override
public String next() {
return concreteAggregate.next(index -1);
}
@Override
public boolean hasNext() {
if(index < concreteAggregate.size()){
index++;
return true;
}
return false;
}
}
在具体迭代器中定义包含一个聚集对象的实例,即对这个聚集对象进行相应操作的访问。
客户端
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
List names = new ArrayList<>(Arrays.asList(new String[]{"James","Lucy","Jack"}));
Aggregate aggregate = new ConcreteAggregate(names);
Iterator iterator = aggregate.iterator();
System.out.println("第一个元素是:" + iterator.first());
System.out.println("最后一个元素是:" + iterator.last());
while(iterator.hasNext()){
System.out.println("遍历元素:" + iterator.next());
}
}
}
在上面的客户端中,首先创建一个聚集类实例,然后调用iterator方法得到一个迭代器角色,得到迭代器角色后,我们就可以进行相关的遍历操作。
- 点赞
- 收藏
- 关注作者
评论(0)