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

    一:迭代器模式的定义
            --->迭代器模式(Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发
            --->它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
            --->迭代器是为容器服务的,那什么是容器呢? 能容纳对象的所有类型都可以称之为容器,例如Collection集合类型、Set类型等,迭代器模式就是为解决遍历这些容器中的元素而诞生的
            --->迭代器模式提供了遍历容器的方便性,容器只要管理增减元素就可以了,需要遍历时交由迭代器进行。



    二:迭代器模式的角色
    ● Iterator抽象迭代器
            抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素,next()访问下一个元素,isDone()是否已经访问到底部(Java叫做hasNext()方法)
    ● ConcreteIterator具体迭代器
            具体迭代器角色要实现迭代器接口,完成容器元素的遍历。
    ● Aggregate抽象容器
            容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似createIterator()这样的方法,在Java中一般是iterator()方法。
    ● Concrete Aggregate具体容器
            具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。


    三:迭代器模式的例子
    【1】迭代器抽象类

     1 package com.yeepay.sxf.template15;
     2 /**
     3  * 迭代器的抽象类
     4  * @author sxf
     5  *
     6  * @param <E>
     7  */
     8 public interface Iterator<E> {
     9     //遍历下一个元素
    10     public E next();
    11     //是否还有下一个元素
    12     public boolean hasNext();
    13     //删除当前指向的元素
    14     public boolean remove();
    15 }
    View Code

    【2】迭代器实现类

     1 package com.yeepay.sxf.template15;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 /**
     6  * 自己实现的迭代器
     7  * @author sxf
     8  *
     9  * @param <E>
    10  */
    11 public class MyItrator<E> implements Iterator<E> {
    12 
    13     private List<E> list=new ArrayList<E>();
    14     
    15     private int cursor=0;
    16     
    17     public MyItrator(List<E> e) {
    18         this.list=e;
    19     }
    20     
    21     @Override
    22     public E next() {
    23         E e=null;
    24         if(this.hasNext()){
    25             e=this.list.get(this.cursor++);
    26         }else{
    27             e=null;
    28         }
    29         return e;
    30     }
    31 
    32     @Override
    33     public boolean hasNext() {
    34         if(this.cursor==this.list.size()){
    35             return false;
    36         }else{
    37             return true;
    38         }
    39     }
    40 
    41     /**
    42      * 开发系统时,迭代器的删除方法应该完成两个逻辑:一是删除当前元素,二是当前游标指向下一个元素
    43      */
    44     @Override
    45     public boolean remove() {
    46         list.remove(cursor);
    47         cursor++;
    48         return true;
    49     }
    50 
    51     
    52 }
    View Code

    【3】自定义集合接口

     1 package com.yeepay.sxf.template15;
     2 /**
     3  * 集合接口
     4  * @author sxf
     5  *
     6  * @param <E>
     7  */
     8 public interface  Aggregate<E> {
     9     public void add(E object);
    10     public void remove(E object);
    11     public  Iterator iterator();
    12 }
    View Code

    【4】自定义集合实现

     1 package com.yeepay.sxf.template15;
     2 /**
     3  * 自定义集合
     4  */
     5 import java.util.ArrayList;
     6 import java.util.List;
     7 
     8 public class MyConnection<E> implements Aggregate<E>{
     9     private List<E> a=new ArrayList<E>();
    10     
    11     @Override
    12     public void add(E object) {
    13         a.add(object);
    14     }
    15 
    16     @Override
    17     public void remove(E object) {
    18         a.remove(object);
    19     }
    20 
    21     @Override
    22     public Iterator iterator() {
    23         
    24         return new MyItrator<E>(this.a);
    25     }
    26 
    27     
    28 }
    View Code

    【5】客户端实现

     1 package com.yeepay.sxf.template15;
     2 
     3 
     4 public class ClientTest {
     5 
     6     
     7     public static void main(String[] args) {
     8         MyConnection<String> st=new MyConnection<String>();
     9         st.add("aaa");
    10         st.add("bbb");
    11         st.add("ccc");
    12         st.add("ddd");
    13         Iterator iterator=st.iterator();
    14         while (iterator.hasNext()) {
    15                 String aString=(String) iterator.next();
    16                 System.out.println("ClientTest.main()"+aString);
    17             
    18         }
    19         
    20     }
    21 }
    View Code
  • 相关阅读:
    实现 HTML页面 Table 标签分页打印
    windows定时休眠设置
    python画树
    anaconda历史版本
    枚举
    is 与 as 运算符举例
    Microsoft.ACE.OLEDB.12.0报错解决方法
    winform一个带自动完成功能的TextBox
    DWZ中整合第三方jQuery(kit日历控件)插件
    asp.net 使用NPOI,泛型反射,XML导入导出excel
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/5148749.html
Copyright © 2011-2022 走看看