• 【设计模式】Java设计模式 - 迭代器模式


    【设计模式】Java设计模式 - 迭代器模式

    😄 不断学习才是王道
    🔥 继续踏上学习之路,学之分享笔记
    👊 总有一天我也能像各位大佬一样
    🏆 一个有梦有戏的人 @怒放吧德德
    🌝分享学习心得,欢迎指正,大家一起学习成长!

    请添加图片描述

    简介

    迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。

    迭代器模式原理解析

    迭代器是java中遍历最常见的一种设计模式,提供一种遍历集合元素的统一接口,用同样的方法来遍历集合,不用知道集合对象的底层表示。
    先来看看原理UML图
    在这里插入图片描述

    角色与职责

    • Iterator:迭代器接口,系统提供。
    • ConcreteIterator:具体迭代器,管理迭代
    • Aggregate:一个统一的聚合接口,将客户端和具体聚合解耦
    • ConcreteAggregate:具体的聚合持有对象集合,创建迭代器。
    • Client: 客户端

    迭代器模式实例

    本次通过车行有许多品牌汽车,车行各自有各种型号的汽车,通过迭代输出相应信息。

    本次使用lombok使用注解减少get、set等操作。
    通过构建车行接口,让具体的旗舰店去实现里面的方法,聚合各自品牌各种型号的汽车,并创建迭代器。定义各种具体的迭代器,实现java.util.Iterator,提供迭代操作数据。

    类图:
    在这里插入图片描述

    ①、创建迭代器接口

    包含添加车店信息和创建迭代器

    package com.lyd.demo.car;
    import java.util.Iterator;
    /**
     * @Author: lyd
     * @Description: 车行 - 迭代器接口
     * @Date: 2022-09-05
     */
    public interface ICarDealership {
        public String getName();
        // 添加车店信息
        public void addFlagshipStore(String name, String description);
        // 创建迭代器
        public Iterator createIterator();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    ②、创建实体

    旗舰店实体类

    package com.lyd.demo.store;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * @Author: lyd
     * @Description: 旗舰店
     * @Date: 2022-09-05
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class FlagshipStore {
        private String name;
        private String description;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    ③、创建实现类

    实现迭代器接口,实现所有方法,实例化具体汽车实体数组,并且创建迭代器

    package com.lyd.demo.car.impl;
    import com.lyd.demo.car.ICarDealership;
    import com.lyd.demo.iterator.HongQiFlagshipStoreIterator;
    import com.lyd.demo.store.FlagshipStore;
    import java.util.ArrayList;
    import java.util.Iterator;
    /**
     * @Author: lyd
     * @Description: 红旗实现类
     * @Date: 2022-09-05
     */
    public class HongQiFlagshipStore implements ICarDealership {
        ArrayList<FlagshipStore> stores;
        public HongQiFlagshipStore() {
            stores = new ArrayList<FlagshipStore>();
            addFlagshipStore("红旗H5", "H5");
            addFlagshipStore("红旗H7", "H7");
            addFlagshipStore("红旗H7", "H9");
        }
        @Override
        public String getName() {
            return "红旗旗舰店";
        }
        @Override
        public void addFlagshipStore(String name, String description) {
            FlagshipStore flagshipStore = new FlagshipStore(name, description);
            stores.add(flagshipStore);
        }
        @Override
        public Iterator createIterator() {
            return new HongQiFlagshipStoreIterator(stores);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    ④、定义具体迭代器

    实现java.util.Iterator并实现其方法

    package com.lyd.demo.iterator;
    import com.lyd.demo.store.FlagshipStore;
    import java.util.ArrayList;
    import java.util.Iterator;
    /**
     * @Author: lyd
     * @Description: 红旗汽车旗舰店 - 迭代器类 - 实现迭代器
     * @Date: 2022-09-05
     */
    public class HongQiFlagshipStoreIterator implements Iterator {
        // 通过ArrayList存放对象FlagshipStore
        ArrayList<FlagshipStore> stores;
        int index = -1; // 索引下标
        public HongQiFlagshipStoreIterator(ArrayList<FlagshipStore> stores) {
            this.stores = stores;
        }
        @Override
        public boolean hasNext() {
            if (index >= stores.size() - 1) {
                return false;
            }
            return true;
        }
        @Override
        public Object next() {
            FlagshipStore flagshipStore = stores.get(++index);
            return flagshipStore;
        }
        @Override
        public void remove() {
            // 删除第一个
            if (stores.size() > 0)
                stores.remove(0);
            else
                System.out.println("删除失败!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    ⑤、定义迭代器操作类

    创建迭代器并且去执行操作迭代器来输出数据。

    package com.lyd.demo.out;
    import com.lyd.demo.car.ICarDealership;
    import com.lyd.demo.store.FlagshipStore;
    import java.util.ArrayList;
    import java.util.Iterator;
    /**
     * @Author: lyd
     * @Description: 输出实现
     * @Date: 2022-09-05
     */
    public class OutImpl {
        ArrayList<ICarDealership> carDealerships; // 接口的数组
        public OutImpl(ArrayList<ICarDealership> carDealerships) {
            this.carDealerships = carDealerships;
        }
        public void printCarDealership() {
            Iterator<ICarDealership> iterator = carDealerships.iterator(); // 装入迭代器Iterator中
            while (iterator.hasNext()) {
                ICarDealership c = iterator.next();
                System.out.println("***************" + c.getName() + "****************");
                printFlagshipStore(c.createIterator()); // 会根据是哪个旗舰店去创建迭代器
            }
        }
        public void printFlagshipStore(Iterator iterator) { // 输出具体汽车型号
            while (iterator.hasNext()) {
                FlagshipStore flagshipStore = (FlagshipStore) iterator.next();
                System.out.println(flagshipStore.getName());
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    ⑥、测试

    package com.lyd.demo.test;
    import com.lyd.demo.car.ICarDealership;
    import com.lyd.demo.car.impl.BenzFlagshipStore;
    import com.lyd.demo.car.impl.HongQiFlagshipStore;
    import com.lyd.demo.out.OutImpl;
    import java.util.ArrayList;
    /**
     * @Author: lyd
     * @Description:
     * @Date: 2022-09-05
     */
    public class IteratorTest {
        public static void main(String[] args) {
            ArrayList<ICarDealership> carDealerships = new ArrayList<ICarDealership>();
            BenzFlagshipStore benz = new BenzFlagshipStore();
            HongQiFlagshipStore hongQiFlagshipStore = new HongQiFlagshipStore();
            carDealerships.add(benz);
            carDealerships.add(hongQiFlagshipStore);
            OutImpl out = new OutImpl(carDealerships);
            out.printCarDealership();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    运行结果:
    在这里插入图片描述
    👍创作不易,可能有些语言不是很通畅,如有错误请指正,感谢观看!记得一键三连哦!👍

    💓德德小建议:

    理解设计模式不是一件简单的事情,需要不断的学习和动手去练习,才能理解。只有掌握好设计模式,才能够真正的理解SpringAOP和Mybatis的底层原理。各位读者可以和我一样,动手敲一敲代码,甚至用不同的例子来做,通过debug一步一步调试,还有就是多看看别人的例子。能够有助于理解!谢谢各位观看指点!❤️ ❤️ ❤️

  • 相关阅读:
    【Cpp】 第一章 C++入门
    记一次DNS问题排查
    Python itertools模块中的combinations() 函数用法
    【设计模式】状态模式
    【技术栈】Redis 中的事务及持久化方式
    js-二级菜单-统一处理动画效果
    2024/2/18 图论 最短路入门 dijkstra 2
    丁鹿学堂:前端面试手写系列之promise(一)
    leetcode:231. 2 的幂(位运算)
    华为云云耀云服务器L实例评测|云耀云服务器L实例部署JumpServer开源堡垒机
  • 原文地址:https://blog.csdn.net/qq_43843951/article/details/126715898