• Java核心篇,二十三种设计模式(十六),行为型——迭代器模式


    一、概念

    提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示

    二、组成角色

    • 抽象迭代器(Iterator)角色:定义访问和遍历聚合元素的接口,通常包含 hasNext()、next() 等方法
    • 具体迭代器(Concretelterator)角色:实现抽象迭代器接口中所定义的方法,完成对聚合对象的遍历,记录遍历的当前位置
    • 抽象聚合(Aggregate)角色:定义容器的基本功能以及提供创建迭代器的接口,将客户端和具体聚合解耦
    • 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,并提供一个方法,返回一个具体迭代器的实例
    • 客户端类(Client)角色:即要使用迭代器模式的地方

    三、适用场景

    • 访问一个聚合对象的内容而无需暴露它的内部表示
    • 支持对聚合对象的多种遍历
    • 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)

    四、业务分析

    既然我们要实现迭代器,那首先我们需要一个容器,迭代器就是要遍历这个容器里的数据元素;而这个容器里边存放的就是我们的业务实体类对象,容器中可以新增和删除业务实体类对象;

    五、代码实现

    Iterator

    1. package com.behaviour.Iterator.Iterator;
    2. public interface Iterator<E> {
    3. boolean hasNext();
    4. E next();
    5. }

    IteratorImpl

    1. package com.behaviour.Iterator.Concretelterator;
    2. import com.behaviour.Iterator.Iterator.Iterator;
    3. import java.util.List;
    4. public class IteratorImpl<E> implements Iterator<E> {
    5. private List<E> list;
    6. private Integer position;
    7. public IteratorImpl(List<E> list){
    8. this.list = list;
    9. position = 0;
    10. }
    11. @Override
    12. public boolean hasNext() {
    13. return this.position < this.list.size();
    14. }
    15. @Override
    16. public E next() {
    17. return this.list.get(this.position++);
    18. }
    19. }

    Aggregate

    1. package com.behaviour.Iterator.Aggregate;
    2. import com.behaviour.Iterator.Client.ToyDomain;
    3. import com.behaviour.Iterator.Iterator.Iterator;
    4. public interface Aggregate {
    5. public abstract Iterator<ToyDomain> iterator();
    6. public abstract void add(ToyDomain toy);
    7. public abstract void remove(ToyDomain toy);
    8. }

    AggregateImpl

    1. package com.behaviour.Iterator.ConcreteAggregate;
    2. import com.behaviour.Iterator.Aggregate.Aggregate;
    3. import com.behaviour.Iterator.Client.ToyDomain;
    4. import com.behaviour.Iterator.Concretelterator.IteratorImpl;
    5. import com.behaviour.Iterator.Iterator.Iterator;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. public class AggregateImpl implements Aggregate {
    9. private List<ToyDomain> toys;
    10. public AggregateImpl(){
    11. this.toys = new ArrayList<>();
    12. }
    13. @Override
    14. public Iterator<ToyDomain> iterator() {
    15. return new IteratorImpl<ToyDomain>(this.toys);
    16. }
    17. @Override
    18. public void add(ToyDomain toy) {
    19. this.toys.add(toy);
    20. }
    21. @Override
    22. public void remove(ToyDomain toy) {
    23. this.toys.remove(toy);
    24. }
    25. }

    ToyDomain

    1. package com.behaviour.Iterator.Client;
    2. public class ToyDomain {
    3. private String name;
    4. private Double price;
    5. public ToyDomain(String name, Double price) {
    6. this.name = name;
    7. this.price = price;
    8. }
    9. public String getName() {
    10. return name;
    11. }
    12. public void setName(String name) {
    13. this.name = name;
    14. }
    15. public Double getPrice() {
    16. return price;
    17. }
    18. public void setPrice(Double price) {
    19. this.price = price;
    20. }
    21. }

    Test

    1. package com.behaviour.Iterator;
    2. import com.behaviour.Iterator.Client.ToyDomain;
    3. import com.behaviour.Iterator.ConcreteAggregate.AggregateImpl;
    4. import com.behaviour.Iterator.Iterator.Iterator;
    5. public class Test {
    6. public static void main(String[] args) {
    7. AggregateImpl aggregate = new AggregateImpl();
    8. aggregate.add(new ToyDomain("长江七号", 10.00));
    9. aggregate.add(new ToyDomain("天线宝宝", 20.00));
    10. ToyDomain temp = new ToyDomain("灰太狼", 30.00);
    11. aggregate.add(temp);
    12. aggregate.remove(temp);
    13. Iterator<ToyDomain> iterator = aggregate.iterator();
    14. while(iterator.hasNext()){
    15. ToyDomain toy = iterator.next();
    16. System.out.println(toy.getName() + "价值 " + toy.getPrice());
    17. }
    18. }
    19. }

  • 相关阅读:
    【数据结构与算法】二叉树的遍历和线索二叉树
    axios 拦截器
    自我实现tcmalloc的项目简化版本
    网络安全复习笔记
    vueelementui+tabs选项卡样式更改-内容待递增
    自动化测试框架Pytest(三)——自定义allure测试报告
    11. v-if、v-show、v-html 的原理和区别?
    【夜读】自我管理的8个小习惯,养成受用一生
    Codeforces 1670 E. Hemose on the Tree
    windows自启动,修改注册表的方式
  • 原文地址:https://blog.csdn.net/ITlanyue/article/details/125426884