设计模式之迭代器模式1

举报
whisperrr 发表于 2021/08/19 16:58:35 2021/08/19
【摘要】 迭代器模式的定义是 通过提供一种方法顺序访问一个聚合对象中的各个元素,而又不必暴露该聚合对象中的内部表示。迭代器模式是针对聚合对象(数组、集合、链表)的“访问”而来。通过定义不同的遍历策略来遍历聚合对象。

  迭代器模式的定义是 通过提供一种方法顺序访问一个聚合对象中的各个元素,而又不必暴露该聚合对象中的内部表示。迭代器模式是针对聚合对象(数组、集合、链表)的“访问”而来。通过定义不同的遍历策略来遍历聚合对象。

  应用场景

  如果希望提供访问一个聚合对象的内容,但又不想暴露它的内部表示的时候可使用迭代器模式

  如果希望有多种遍历方式可以访问聚合对象。

  如果希望为遍历不同的聚合对象提供一个统一的接口,可以使用迭代器模式(多态迭代)。

  迭代器模式中涉及的角色:

  抽象迭代器角色(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方法得到一个迭代器角色,得到迭代器角色后,我们就可以进行相关的遍历操作。

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。