zoukankan      html  css  js  c++  java
  • GoF23种设计模式之行为型模式之迭代器模式

    一、概述
        给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
    二、适用性
    1.当访问一个聚合对象的内容而无需暴露它的内部表示的时候。
    2.当对聚合对象的多种遍历提供支持的时候。
    3.当为了遍历不同的聚合结构提供一个统一的接口的时候(多态迭代)。
    三、参与者
    1.Iterator:迭代器定义访问和遍历元素的接口。
    2.ConcreteIterator:具体迭代器实现迭代器接口。对该聚合遍历时跟踪当前位置。
    3.Aggregate:聚合定义创建相应迭代器对象的接口。
    4.ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.
    四、类图

    五、示例

    Iterator

    [java] view plain copy
     
     print?
    1. package cn.lynn.iterator;  
    2.   
    3. public interface Iterator {  
    4.   
    5.     public void first();  
    6.   
    7.     public void last();  
    8.   
    9.     public boolean hasNext();  
    10.   
    11.     public Object next();  
    12.   
    13. }  

    ConcreteIterator

    [java] view plain copy
     
     print?
    1. package cn.lynn.iterator;  
    2.   
    3. public class IteratorImpl implements Iterator {  
    4.   
    5.     private List list;  
    6.   
    7.     private int index;  
    8.   
    9.     public IteratorImpl(List list) {  
    10.         index = 0;  
    11.         this.list = list;  
    12.     }  
    13.   
    14.     @Override  
    15.     public void first() {  
    16.         index = 0;  
    17.     }  
    18.   
    19.     @Override  
    20.     public void last() {  
    21.         index = list.getSize();  
    22.     }  
    23.   
    24.     @Override  
    25.     public boolean hasNext() {  
    26.         return index < list.getSize();  
    27.     }  
    28.   
    29.     @Override  
    30.     public Object next() {  
    31.         Object obj = list.get(index);  
    32.         index++;  
    33.         return obj;  
    34.     }  
    35.   
    36. }  

    Aggregate

    [java] view plain copy
     
     print?
    1. package cn.lynn.iterator;  
    2.   
    3. public interface List {  
    4.   
    5.     public Iterator iterator();  
    6.   
    7.     public Object get(int index);  
    8.   
    9.     public int getSize();  
    10.   
    11.     public void add(Object obj);  
    12.   
    13. }  

    ConcreteAggregate

    [java] view plain copy
     
     print?
    1. package cn.lynn.iterator;  
    2.   
    3. public class ListImpl implements List {  
    4.   
    5.     private Object[] objArr;  
    6.   
    7.     private int index;  
    8.   
    9.     private int size;  
    10.   
    11.     public ListImpl() {  
    12.         index = 0;  
    13.         size = 0;  
    14.         objArr = new Object[50];  
    15.     }  
    16.   
    17.     @Override  
    18.     public Iterator iterator() {  
    19.         return new IteratorImpl(this);  
    20.     }  
    21.   
    22.     @Override  
    23.     public Object get(int index) {  
    24.         return objArr[index];  
    25.     }  
    26.   
    27.     @Override  
    28.     public int getSize() {  
    29.         return size;  
    30.     }  
    31.   
    32.     @Override  
    33.     public void add(Object obj) {  
    34.         objArr[index++] = obj;  
    35.         size++;  
    36.     }  
    37.   
    38. }  

    Client

    [java] view plain copy
     
     print?
    1. package cn.lynn.iterator;  
    2.   
    3. public class Client {  
    4.   
    5.     public static void main(String[] args) {  
    6.         List list = new ListImpl();  
    7.         list.add("张三");  
    8.         list.add("李四");  
    9.         list.add("王五");  
    10.         Iterator iterator = list.iterator();  
    11.         while (iterator.hasNext()) {  
    12.             System.out.println(iterator.next());  
    13.         }  
    14.         System.out.println("********");  
    15.         for (int i = 0; i < list.getSize(); i++) {  
    16.             System.out.println(list.get(i));  
    17.         }  
    18.     }  
    19. }  

    Result

    [java] view plain copy
     
     print?
      1. 张三  
      2. 李四  
      3. 王五  
      4. ********  
      5. 张三  
      6. 李四  
      7. 王五  
  • 相关阅读:
    解决Tomcat无法shutdown进程
    ConcurrentHashMap Put()操作示例代码
    Spring Data JPA
    JAVA CAS原理
    多线程
    多线程
    java 虚拟机--新生代与老年代GC
    TCP协议中的三次握手和四次挥手
    java中volatile关键字
    Java多线程
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7471494.html
Copyright © 2011-2022 走看看