zoukankan      html  css  js  c++  java
  • GOF23设计模式之迭代器模式(iterator)

    一、迭代器模式概述

      提供一种可以遍历聚合对象的方式。又称为:游标(cursor)模式

      结构:

        (1)聚合对象:存储数据

        (2)迭代器:遍历数据

    二、迭代器模式示例代码

      定义:正向遍历迭代器和逆向遍历迭代器

     1 /**
     2  * 自定义迭代器接口
     3  * @author CL
     4  *
     5  */
     6 public interface MyIterator {
     7     /**
     8      * 如果仍有元素可以迭代,则返回 true
     9      * @return
    10      */
    11     boolean hasNext();
    12     /**
    13      * 返回迭代的下一个元素
    14      * @return
    15      */
    16     Object next();
    17     /**
    18      * 从迭代器指向的集合中移除迭代器返回的最后一个元素
    19      */
    20     void remove();
    21     
    22 }
     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 /**
     5  * 自定义聚合类
     6  * @author CL
     7  *
     8  */
     9 public class ConcreteAggregate {
    10     private List<Object> list;
    11 
    12     public ConcreteAggregate() {
    13         list = new ArrayList<Object>();
    14     }
    15     
    16     public boolean addObject(Object obj) {
    17         return this.list.add(obj);
    18     }
    19     
    20     public boolean removeObject(Object obj) {
    21         return this.list.remove(obj);
    22     }
    23     
    24     /**
    25      * 获得正向遍历的迭代器对象
    26      * @return
    27      */
    28     public MyIterator creatIterator() {
    29         return new ConcreteIterator(0);
    30     }
    31     
    32     /**
    33      * 获得逆向遍历的迭代器对象
    34      * @return
    35      */
    36     public MyIterator creatConverseIterator() {
    37         return new ConcreteIterator(list.size()-1);
    38     }
    39     
    40     /**
    41      * 自定义迭代器内部类
    42      * @author CL
    43      *
    44      */
    45     private class ConcreteIterator implements MyIterator {
    46         
    47         private int cursor;
    48         
    49         private final int firstValue;
    50         
    51         public ConcreteIterator(int cursor) {
    52             this.cursor = cursor;
    53             this.firstValue = cursor;
    54         }
    55 
    56         @Override
    57         public boolean hasNext() {
    58             if (firstValue == 0) {    //正向遍历
    59                 if (cursor < list.size()) {
    60                     return true;
    61                 }
    62             } else if (firstValue == list.size()-1) {    //逆向遍历
    63                 if (cursor >= 0) {
    64                     return true;
    65                 }
    66             }
    67             return false;
    68         }
    69 
    70         @Override
    71         public Object next() {
    72             if (firstValue == 0) {    //正向遍历
    73                 if (cursor < list.size()) {
    74                     return list.get(cursor++);
    75                 }
    76             } else if (firstValue == list.size()-1) {    //逆向遍历
    77                 if (cursor >= 0) {
    78                     return list.get(cursor--);
    79                 }
    80             }
    81             return null;
    82         }
    83 
    84         @Override
    85         public void remove() {
    86             list.remove(cursor);
    87         }
    88     }
    89 }

      测试:

     1 /**
     2  * 测试迭代器对象
     3  * @author CL
     4  *
     5  */
     6 public class Client {
     7 
     8     public static void main(String[] args) {
     9         ConcreteAggregate ca = new ConcreteAggregate();
    10         ca.addObject("aa");
    11         ca.addObject("bb");
    12         ca.addObject("cc");
    13         ca.addObject("dd");
    14         
    15         System.out.println("正向遍历:");
    16         MyIterator it = ca.creatIterator();
    17         while (it.hasNext()) {
    18             System.out.println(it.next());
    19         }
    20         
    21         System.out.println("逆向遍历:");
    22         MyIterator it2 = ca.creatConverseIterator();
    23         while (it2.hasNext()) {
    24             System.out.println(it2.next());
    25         }
    26     }
    27 }

      控制台输出:

    正向遍历:
    aa
    bb
    cc
    dd
    逆向遍历:
    dd
    cc
    bb
    aa

    三、迭代器模式常见开发应用场景

      (1)JDK内置的迭代器(List / Set)

          List / Set 实现了 Collection 接口,Collection 实现了 Iterator 接口。

      (2)…………

  • 相关阅读:
    NEO发行资产Token
    OSCP考试回顾
    Windows降权
    Mimikatz.ps1本地执行
    MS16-032提权正确方法
    一种通过HTTP传文件出网的姿势
    mac chromedriver error
    关于websocket 在生产环境中遇到的问题 及 解决办法
    how to install protobuff python
    Git 使用疑问
  • 原文地址:https://www.cnblogs.com/cao-lei/p/8329227.html
Copyright © 2011-2022 走看看