设计模式之禅之设计模式-迭代器模式

一:迭代器模式的定义
        --->迭代器模式(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 }

【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 }

【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 }

【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 }

【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 }

时间: 2024-10-07 08:22:06

设计模式之禅之设计模式-迭代器模式的相关文章

《设计模式之禅》之迭代器模式

一.迭代器模式的定义 它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节. 迭代器是为容器服务的,那什么是容器? 能容纳对象的所有类型都可以称之为容器,例如Collection集合类型.Set类型等,迭代器就是为解决遍历这些容器中的元素而诞生的. Iterator抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素,next()访问下一个元素,isDone()是否已经访问到底部(Java叫做hasNext()方法) C

设计模式之第6章-迭代器模式(Java实现)

设计模式之第6章-迭代器模式(Java实现) “我已经过时了,就不要讲了吧,现在java自带有迭代器,还有什么好讲的呢?”“虽然已经有了,但是具体细节呢?知道实现机理岂不美哉?”“好吧好吧.”(迭代器闷闷不乐的答应下来.作者吃着小笼包,咂咂嘴道:哼,想偷懒,窗户都没有~). 迭代器模式之自我介绍 正如你们所见,我目前已经没落了,基本上没人会单独写一个迭代器,除非是产品性质的研发,我的定义如下:Provide a way to access the elements of an aggregate

Java设计模式(八)观察者模式 迭代器模式

(十五)观察者模式 观察者模式,定义对象间一对多关系,一个对象状态发生改变,所有依赖于它的对象都收到通知并且自动更新,观察者与被观察者分开.例如邮件订阅.RSS订阅,如果有更新就会邮件通知你. interface Observers{ public void update(); } class Observer1 implements Observers{ public void update(){ System.out.println("observer1 has received"

.NET设计模式(18):迭代器模式(Iterator Pattern)(转)

概述 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据.面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责.Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据. 意图 提供一种方法顺序访问一个聚合对象中

设计模式之十六:迭代器模式(Iterator)

迭代器模式: 提供了一种在不暴漏对象底层细节的情况下顺序访问聚合对象的方法. Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 其实这个设计模式用的很多,但是设计的很少.因为stl中的迭代器就是这个模式的应用.估计这个设计模式的名字就是用从stl中的迭代器而来的. UML图: 主要包括: Iterator:

(38)23种设计模式研究之九【迭代器模式和组合模式】

一.定义 迭代器可以认为是一个指针,可以遍历容器的指针.迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器物件的内容迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址.迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器.然而迭代器有很多不同的能力,它可以把抽象容器和

【java设计模式】(6)---迭代器模式(案例解析)

设计模式之迭代器模式 一.java迭代器介绍 1.迭代器接口 在jdk中,与迭代器相关的接口有两个:Iterator 与 Iterable. Iterator:迭代器,Iterator及其子类通常是迭代器本身的结构与方法:迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的.只要拿到 这个对象,使用迭代器就可以遍历这个对象的内部. Iterable:可迭代的,那些想用到迭代器功能的其它类,如AbstractList HashM

设计模式@第19章:迭代器模式

第19章:迭代器模式 一.看一个具体的需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: 传统的设计方案(类图) ? 学校 ? 学院 系 三.传统的方式的问题分析 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案,==不能很好实现的遍历的操作== 解决方案:=> 迭代器模式 四.

设计模式之禅之设计模式-访问者模式

一:访问者模式定义        --->封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. 二:访问者模式角色● Visitor——抽象访问者        抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象是可以被访问的.● ConcreteVisitor——具体访问者        它影响访问者访问到一个类后该怎么干,要做什么事情.● Element——抽象元素        接口或者抽象类,声