简易理解设计模式之:迭代器模式——遍历对象的好帮手

介绍:

迭代器模式属于行为型模式。它提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

类图:
迭代器模式UML类图.png
Iterator(迭代器接口):定义、访问和遍历元素的接口
ConcreteIterator(具体迭代器类):实现迭代器接口,并记录遍历的当前位置
Aggregate(容器接口):提供创建具体迭代器角色的接口
ConcreteAggregate(具体容器类):实现容器接口功能

用法:
• 遍历一个集合对象的时候

个人理解:
这个模式比较古老,很多语言也会自带这种模式,比如Java中的List、Map、数组等也已经封装了这种方法了。实际开发中我们已经不会再使用这个模式了。for循环、foreach循环已经很满足我们的开发需求了。

例子:
这种模式的学习价值还是很高的,我们就过一遍如何使用这个模式。

需求:实现迭代器

1、定义Iterator接口

public interface Iterator<T> {
    //是否有下一个元素
    boolean hasNext();

    //返回当前位置元素并将位置移到下一位
    T next();
}

此接口用于统一业务层的抽象方法。帮助集合对象遍历的时候不暴露该对象的内部表示。

2、实现ConcreteIterator类

public class ConcreteIterator<T> implements Iterator<T> {
    private List<T> list = new ArrayList<>();
    private int cursor = 0;

    public ConcreteIterator(List<T> list){
        this.list = list;
    }

    @Override
    public boolean hasNext() {
        return cursor != list.size();
    }

    @Override
    public T next() {
        T obj = null;
        if (this.hasNext()){
            obj = this.list.get(cursor++);
        }
        return obj;
    }
}

为了方便操作,我们集合对象的数组用List表示,原则上是用Object[]。在Iterator接口中的方法,遍历时业务层只关注:有没有后面一个hasNext()、获得的元素是什么next(),而具体实现的细节就是Iterator做好了。

3、定义Aggregate接口

public interface Aggregate<T> {
    void add(T obj);
    void remove(T obj);
    Iterator<T> iterator();
}

此接口创建迭代器,并为集合中的元素对象提供操作方法。

4、实现ConcreteAggregate类

public class ConcreteAggregate<T> implements Aggregate<T>{

    private List<T> list = new ArrayList<>();

    @Override
    public void add(T obj) {
        list.add(obj);
    }

    @Override
    public void remove(T obj) {
        list.remove(obj);
    }

    @Override
    public Iterator<T> iterator() {
        return new ConcreteIterator<T>(list);
    }
}

Aggregate的核心就是创建一个迭代器,把组装好的数据交给迭代器去遍历。

5、测试与运行结果

public class Test {
    public static void main(String[] args) {
        Aggregate<String> a = new ConcreteAggregate<>();
        a.add("A");
        a.add("B");
        a.add("C");
        a.add("D");
        Iterator<String> i = a.iterator();
        while (i.hasNext()){
            System.out.println(i.next());
        }
    }
}
运行结果:

A
B
C
D

总结:
迭代器模式分离了对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部数据。

感谢您的阅读~

推荐阅读

基础篇:
设计模式前篇之——UML类图必会知识点
设计模式前篇之——一起过一下面向对象的概念
创建型模式:
简易理解设计模式之:简单工厂模式——来试试接入支付功能
简易理解设计模式之:工厂方法模式——数据存储例子
简易理解设计模式之:抽象工厂模式——更换数据库例子
简易理解设计模式之:建造者模式——学习使用“链式调用”
简易理解设计模式之:原型模式——深、浅拷贝的概念
简易理解设计模式之:单例模式——单例模式的几种常用写法
结构型模式:
简易理解设计模式之:适配器模式——Android列表视图控件设计方式
简易理解设计模式之:桥接模式——穿衣服经典案例2
简易理解设计模式之:组合模式——实现View中的树状结构
简易理解设计模式之:装饰模式——穿衣服经典案例
简易理解设计模式之:外观模式——第三方SDK的帮助类
简易理解设计模式之:享元模式——五子棋游戏例子
简易理解设计模式之:代理模式——iOS视图控件设计方式
行为型模式:
简易理解设计模式之:策略模式——优化一下支付功能
简易理解设计模式之:模板方法模式——Android中的BaseActivity基类
简易理解设计模式之:观察者模式——监听与回调
简易理解设计模式之:状态模式——优化登录操作
简易理解设计模式之:备忘录模式——Word文档的工作原理
简易理解设计模式之:迭代器模式——遍历对象的好帮手
简易理解设计模式之:命令模式——实现命令的参数化配置
简易理解设计模式之:责任链模式——OA中请假流程示例
简易理解设计模式之:中介者模式——多人聊天室例子
简易理解设计模式之:解释器模式——语言和文法
简易理解设计模式之:访问者模式——员工考核例子

posted @ 2022-11-21 18:56  TwcatL_tree  阅读(6)  评论(0编辑  收藏  举报