zoukankan      html  css  js  c++  java
  • 大话设计模式之迭代器模式

    迭代器模式

      提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露对象的内部表示。

    迭代器模式的角色构成

    (1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:取得下一个元素的方法next(),判断是否遍历结束的方法hasNext()),移出当前对象的方法remove(),

    (2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代。

    (3)容器角色(Aggregate):  一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等

    (4)具体容器角色(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。

    模拟迭代器实现

    创建迭代器角色 

    /**
     * @Author: chen
     * @Description: 定义抽象迭代器
     * @Date: created in 2018/8/20
     * @Modified By:
     */
    public interface MyIterator {
    
        Boolean hasNext();
        Object next();
    
    }  

    自定一个聚集类;在聚集类内部,使用内部类的方式来定义迭代器的具体实现。

    package com.chenpt.designModel.iteratorModel;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @Author: ch
     * @Description: 聚集类
     * @Date: created in 2018/8/20
     * @Modified By:
     */
    public class Aggregate {
        private List<Object> list = new ArrayList<>();
    
        public MyIterator getIterator(){
            return new InnerIterator();
        }
    
        public void add(Object obj){
            list.add(obj);
        }
    
    
        //使用内部类来定义迭代器
        private class InnerIterator implements MyIterator{
            int i=0;
            public Boolean hasNext(){
                if(i<list.size()){
                    return true;
                }
                return false;
            }
    
            public Object next(){
                return list.get(i++);
            }
        }
    
    }

    客户端测试

    public class MainTest {
    
        public static void main(String[] args){
            Aggregate aggregate = new Aggregate();
            aggregate.add("上海");
            aggregate.add("南京");
            aggregate.add("北京");
    
            for (MyIterator it = aggregate.getIterator();it.hasNext();){
                Object o = it.next();
                System.out.println(o.toString());
            }
        }
    
    }
    //结果
    上海
    南京
    北京
    

    优点:

     1、它支持以不同的方式遍历一个聚合对象。

    2、迭代器简化了聚合类。

    3、在同一个聚合上可以有多个遍历。

    4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

    缺点:

    由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

      

  • 相关阅读:
    UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)
    Codeforces 482E ELCA (LCT)
    Codeforces 798D Mike and distribution (构造)
    AtCoder AGC017C Snuke and Spells
    HDU 6089 Rikka with Terrorist (线段树)
    HDU 6136 Death Podracing (堆)
    AtCoder AGC032D Rotation Sort (DP)
    jenkins+python+kubectl实现批量更新k8s镜像
    Linux 下载最新kubectl版本的命令:
    jenkins X 和k8s CI/CD
  • 原文地址:https://www.cnblogs.com/chenpt/p/9506480.html
Copyright © 2011-2022 走看看