23种设计模式_MODE16迭代器模式_手写代码实现

简介: 23种设计模式_MODE16迭代器模式_手写代码实现

1. 迭代器模式测试 == 典型的类似集合的方式实现了我们自己的迭代器,通过迭代器实现元素的遍历


package com.zhaoshuangjian.mode16_迭代器模式;
import com.zhaoshuangjian.mode16_迭代器模式.mode16.AbstractAggregate;
import com.zhaoshuangjian.mode16_迭代器模式.mode16.IIterator;
import com.zhaoshuangjian.mode16_迭代器模式.mode16.MyCollection;
/**
 * <p>迭代器模式测试 == 典型的类似集合的方式实现了我们自己的迭代器,通过迭代器实现元素的遍历</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class IteratorTest {
    public static void main(String[] args) {
        myIterator();
    }
    private static void myIterator(){
        Integer[] numArr = new Integer[]{1,2,3};
        AbstractAggregate aggregate = new MyCollection(numArr);
        IIterator iterator = aggregate.createIterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("==============若想要迭代器继续迭代输出元素");
        System.out.println("first = " +iterator.first());
        System.out.println("==============我们可以调用first方法重置pos");
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("==============我们再来创建一个迭代器对象出来");
        IIterator iteratorOther = aggregate.createIterator();
        while (iteratorOther.hasNext()){
            System.out.println(iteratorOther.next());
        }
    }
    /**
     * <p>资料如此描述迭代器模式:</p>
     * 迭代器模式又叫游标模式,是对象的行为模式。
     * 迭代器模式可以顺序的访问一个聚集中的元素而不必暴露聚集内部表象。
     *
     * 什么意思呢,博主来白话一下:
     * (1)这是对对象的操作,因此属于对象的行为操作范畴
     * (2)聚集对象可以进行元素的遍历,既然是遍历,肯定要讲究顺序的(pos++)
     * (3)使用者知道怎么遍历取出元素就行,具体聚合类是怎么实现的,
     *      不告诉你,反正你给我传一个数组就行,我给你创建一个迭代器出来,
     *      具体怎么玩,你拿着我给你创建好的迭代器琢磨去吧!
     *
     *  优点:
     *  (1)本来聚集类要干的事情,分担给具体的迭代器类了,聚集类和迭代器实现了很好的解耦,
     *       这样一来,迭代的算法可以完全独立于聚集类;
     *  (2)一个聚集类的对象,也就是聚集对象,可以创建出N个迭代器,同时进行元素迭代而互不干扰
     */
}

2. 抽象出来一个聚集类 == 提供创建集合对象迭代器的一系列抽象方法

package com.zhaoshuangjian.mode16_迭代器模式.mode16;
/**
 * <p>抽象出来一个聚集类 == 提供创建集合对象迭代器的一系列抽象方法</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public abstract class AbstractAggregate {
    /**
     * <p>创建聚集对象的迭代器 == 使用迭代器对集合进行相关操作</p>
     * @return 对象的迭代器
     */
    public abstract com.zhaoshuangjian.mode16_迭代器模式.mode16.IIterator createIterator();
    /**
     * <p>返回聚集对象(集合、迭代器对象)包含的对象(元素)的大小</p>
     * @return 大小
     */
    public abstract int size();
    /**
     * <p>聚集对象包含的元素是否为空</p>
     * @return 空(true)不空(false)
     */
    public abstract boolean isEmpty();
}

3.迭代器接口

package com.zhaoshuangjian.mode16_迭代器模式.mode16;
/**
 * <p>迭代器接口</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public interface IIterator {
    /**
     * <p>当前迭代器中是否还有元素</p>
     * @return 有(true) 没有(false)
     */
    boolean hasNext();
    /**
     * <p>取出迭代器中的元素</p>
     * @return 对象
     */
    Object next();
    /**
     * <p>取出迭代器中的第一个元素</p>
     * @return 第一个元素
     */
    Object first();
}

4.自定义集合类,实现聚集抽象类中的迭代器的创建方法

package com.zhaoshuangjian.mode16_迭代器模式.mode16;
/**
 * <p>自定义集合类,实现聚集抽象类中的迭代器的创建方法</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class MyCollection extends com.zhaoshuangjian.mode16_迭代器模式.mode16.AbstractAggregate {
    /**
     * 集合的底层用的就是数组
     */
    Object[] objArr ;
    public MyCollection(Object[] objArr){
        this.objArr = objArr;
    }
    @Override
    public com.zhaoshuangjian.mode16_迭代器模式.mode16.IIterator createIterator() {
        /**
         * 将当前集合对象作为参数,调用迭代器的构造函数
         * 注意,该方法的NB之处,就是同一个聚集对象可以new出来好多个迭代器
         * 虽然,上面一段话说出来跟没说一样,但是博主还是想傻傻的强调一下
         */
        return new MyIterator(this);
    }
    @Override
    public int size() throws NullPointerException{
        if(objArr == null){
            throw new NullPointerException("objArr is null !");
        }
        return objArr.length;
    }
    @Override
    public boolean isEmpty() throws NullPointerException{
        if(objArr == null){
            throw new NullPointerException("objArr is null !");
        }
        return objArr.length == 0 ;
    }
    public Object[] getObjArr() {
        return objArr;
    }
    public void setObjArr(Object[] objArr) {
        this.objArr = objArr;
    }
}

5.自定义迭代器,实现迭代器接口中的所有方法

package com.zhaoshuangjian.mode16_迭代器模式.mode16;
/**
 * <p>自定义迭代器,实现迭代器接口中的所有方法</p>
 *
 * @Author zhaoshuangjian  2023-03-25 下午21:44
 */
public class MyIterator implements com.zhaoshuangjian.mode16_迭代器模式.mode16.IIterator {
    /**
     * 迭代器的目标对象,就是集合
     */
    private com.zhaoshuangjian.mode16_迭代器模式.mode16.MyCollection collection ;
    /**
     * 这里保留一份集合对象包含的元素的大小
     */
    private int size ;
    /**
     * 记录元素的位置
     */
    private int pos = 0 ;
    public MyIterator(com.zhaoshuangjian.mode16_迭代器模式.mode16.MyCollection collection){
        this.collection = collection ;
        this.size = collection.size();
    }
    @Override
    public boolean hasNext() {
        /**
         * (1)只要size不等于pos初始化时候的0,集合里肯定是有元素的
         * (2)返回true的时候,一定不要忘了让pos往后移,这就是迭代器只能使用一次的原因所在
         * (3)如果想复用迭代器,调用first函数,重置pos位置的值
         */
        if(pos < size){
            pos++;
            return true;
        }
        return false;
    }
    @Override
    public Object next() {
        return collection.getObjArr()[pos-1];
    }
    @Override
    public Object first() {
        pos = 0;
        return collection.getObjArr()[0];
    }
}


相关文章
|
3月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
58 2
|
3月前
|
设计模式 Java Kotlin
Kotlin - 改良设计模式 - 迭代器模式
Kotlin - 改良设计模式 - 迭代器模式
40 0
|
3月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
43 0
|
4月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
4月前
|
设计模式 Java 开发者
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文重点介绍迭代器模式,通过具体示例展示了如何在Kotlin中实现迭代器模式,包括使用Iterator、Iterable接口及重载iterator运算符的方法。
46 4
|
4月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
46 2
|
4月前
|
设计模式 Java 开发者
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
本教程详细讲解了Kotlin中的迭代器模式,包括如何通过实现Iterator和Iterable接口以及重载iterator运算符来实现可遍历的自定义集合。示例展示了如何创建一个图书集类,并通过不同方式使其支持遍历操作,适合希望深入了解Kotlin迭代器模式的开发者。
47 3
|
4月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
43 1
|
4月前
|
设计模式 Java Kotlin
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
Kotlin教程笔记(54) - 改良设计模式 - 迭代器模式
36 1
|
4月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。

热门文章

最新文章