《设计模式》-- 迭代器模式

迭代器模式

认识

迭代子模式是对象的行为模式。迭代子模式可以顺序地访问一个聚合对象中的元素而不必暴露聚合对象的内部表示

JAVA聚合对象是实现了共同的java.util.Collection接口的对象,还有数组(最基本的聚合对象)

思考

迭代器的关键思想就是把对聚合对象的遍历和访问从聚合对象中分离出来,放入单独的迭代器中处理。这样聚合对象职责会简单些,聚合对象和迭代器可以独立、灵活的扩展。

本质是:控制访问聚合对象中的元素。

使用场景

当想要访问一个聚合对象,而又不想暴露它的内部表示的时候,可以让客户端通过迭代器访问,而不去关心聚合对象的内部实现

增加一种遍历聚合对象的方式的时候可以使用迭代器模式

为一类对象提供相同的遍历方式的时候使用迭代器模式,如List接口下所有的实现类都可以使用Itorator进行遍历。

优缺点

  • 优点:更好的封装性,简化了聚合对象

  • 缺点:

UML图

image

  • 抽象迭代子(Iterator)角色:此抽象角色定义出遍历元素所需的接口。
  • 具体迭代子(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。
  • 聚合(Aggregate)角色:此抽象角色给出创建迭代子(Iterator)对象的接口。
  • 具体聚合(ConcreteAggregate)角色:实现了创建迭代子(Iterator)对象的接口,返回一个合适的具体迭代子实例。
  • 客户端(Client)角色:持有对聚集及其迭代子对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。

代码实现

可以参考List接口下实现类迭代器的实现

//抽象聚合对象类
public abstract class Aggregate {
    //工厂方法,创建相应迭代子对象的接口
    public abstract Iterator createIterator();
}
//聚合对象子类
public class ConcreteAggregate extends Aggregate {

    private Object[] objArray = null;
    // 创建迭代器,传入聚合对象的具体内容
    public ConcreteAggregate(Object[] objArray){
        this.objArray = objArray;
    }

    @Override
    public Iterator createIterator() {

        return new ConcreteIterator(this);
    }
    //取值方法:向外界提供聚集元素
    public Object getElement(int index){

        if(index < objArray.length){
            return objArray[index];
        }else{
            return null;
        }
    }
    //取值方法:向外界提供聚集的大小
    public int size(){
        return objArray.length;
    }
}
//迭代器接口
public interface Iterator {
    //迭代方法:移动到第一个元素
    public void first();
    //迭代方法:移动到下一个元素
    public void next();
    //迭代方法:是否为最后一个元素
    public boolean isDone();
    //迭代方法:返还当前元素
    public Object currentItem();
}
//具体迭代器
public class ConcreteIterator implements Iterator {
    //持有被迭代的具体的聚合对象
    private ConcreteAggregate agg;
    //内部索引,记录当前迭代到的索引位置
    private int index = 0;
    //记录当前聚集对象的大小
    private int size = 0;

    public ConcreteIterator(ConcreteAggregate agg){
        this.agg = agg;
        this.size = agg.size();
        index = 0;
    }
    //迭代方法:返还当前元素
    @Override
    public Object currentItem() {
        return agg.getElement(index);
    }
    //迭代方法:移动到第一个元素
    @Override
    public void first() {

        index = 0;
    }
    //迭代方法:是否为最后一个元素
    @Override
    public boolean isDone() {
        return (index >= size);
    }
    // 迭代方法:移动到下一个元素
    @Override
    public void next() {
        if(index < size)
        {
            index ++;
        }
    }
}
//客户端
public class Client {
    public static void main(String[] args) {
         Object[] objArray = {"One","Two","Three","Four","Five","Six"};
        //创建聚合对象
        Aggregate agg = new ConcreteAggregate(objArray);
        //获取聚合对象的迭代器
        Iterator it = agg.createIterator();
        //循环输出聚合对象中的值
        while(!it.isDone()){
            System.out.println(it.currentItem());
            it.next();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介: 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 本课程内容定位学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。本章将详细介绍开闭原则(OCP)、依赖倒置原则(DIP)、单一职责原则(SRP)、接口隔离原则(ISP)、迪米特法则(LoD)、里氏替换原则(LSP)、合成复用原则(CARP)的具体内容。 为什么需要学习这门课程? 你在日常的开发中,会不会也遇到过同样的问题。系统出现问题,不知道问题究竟出在什么位置;当遇到产品需求,总是对代码缝缝补补,不能很快的去解决。而且平时工作中,总喜欢把代码堆在一起,出现问题时,不知道如何下手,工作效率很低,而且自己的能力也得不到提升。而这些都源于一个问题,那就是软件设计没做好。这门课能帮助你很好的认识设计模式,让你的能力得到提升。课程大纲: 为了让大家快速系统了解设计模式知识全貌,我为您总结了思维导图,帮您梳理学习重点,建议收藏!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值