转载http://terryblog.blog.51cto.com/1764499/603456

Iterator Pattern迭代器模式

场景猜想

  经常编写代码都会碰到遍历一个数组,使用for循环得到数组下标之后去做进一步操作。例如下文代码:

int []array = new int [ 5 ];
for ( int i = 0 ;i < array.length;i ++ ){
System.out.println(
"" + i);
}

或:

int []array = new int [ 5 ];
for ( int i:array){
System.out.println(
"" + i);
}

当然,还有更多的作法,利用将 i 将下标推移的方式遍历数组元素。

  使用设计模式来编写的时候,可以将 i 的行为,抽象化为迭代器,这种模式我们称之为迭代器模式 。迭代器模式可以用来作为遍历一个集合体。java 亦提供了一个工具类:java.util.Iterator<E> ,与其类似。

场景需求

  书架上有5本技术书籍,要求将书籍名称一性遍历出来,将显示在Andriod 的 EditText 上面。以上面的需求为例,可以将具体需求具体到下面的示意图:

Aggregate接口

  Aggregate 接口是一个执行递增的“聚合”。实现此接口的类就变成类似数组、集合的“聚合”。表示己聚合的接口,实现了该接口的对象传已组织好了的对象集合this给实现Iterator接口的对象

Iterator接口

  Iterator 接口执行元素递增,具有类似循环变量的功能。表示执行递增、遍历的接口,实现该接口的对象用实现Aggregate接口对象的引用实现循环功能

Book 类

  Book 表示书籍,主要是为了获取书的详细。

BookShelf类

  BookShelf 表示书架,此类实现Aggregate接口从而将其作为聚合处理

BookShelfIterator类

  BookShelfIterator表示扫描书架的类,实现了Iterator 的接口功能

-----------------------------------------

IteratorPatternsActivity 类

  IteratorPatternsActivity 为Android 的主界面,用来显示和测试上面编写的代码

-----------------------------------------

代码实现:

  Aggregate接口

/**
*声明一个Iterator方法,这是为了建立一个可对应聚合的Iterator
*如欲递增、遍历或逐一检查某一个聚合时,利用iterator方法即可建立一个
*实现Iterator接口的类对象实例。
*
@author terry
*
*/
public interface Aggregate{
public abstract Iteratoriterator();
}

  Iterator 接口

public interface Iterator{

public abstract boolean hasNext(); // 存在一条则返回true

public abstract Objectnext(); // 移到下一条记录
}

  next 方法是返回聚合当中的1个元素。不过,next 方法的功能并非仅仅如此。事实上它还会悄悄地先要在内部状态进入下一步,以便下次调用 next 方法时能确实返回下一个元素。而Iterator 只描述了有两个方法,具体这两个方法如何实现还要看 BookShelfIterator 内部的实现。

  Book 类

/**
*表示书籍的类
*
@author terry
*
*/
public class Book{

private Stringname = "" ;
public Book(Stringname){
this .name = name;
}

public StringgetName(){
return this .name;
}
}

  BookShelf 类

/**
*表示书架意图的类
*要实现Aggreagate接口才能把这个类当作聚合来处理。
*
@author terry
*
*/
public class BookShelf implements Aggregate{

private Book[]books;
private int last = 0 ;
public BookShelf( int maxSize){
this .books = new Book[maxSize];
}

public BookgetBookAt( int index){
return books[index];
}


public BookShelfappendBook(Bookbook){
this .books[last] = book;
last
++ ;
return this ;
}
public int getLength(){
return this .last;
}



@Override
public Iteratoriterator(){
// TODOAuto-generatedmethodstub
return new BookShelfIterator( this );
}

}

  BookShelf实现了Aggregate 接口 ,该方法产生并返回BookShelfIterator类的对象实例,即我们发一个命令说要对书架进行扫描时,就将得到的“聚合”返回出去。

  BookShelfIterator 类

1 /**
2 *执行扫描书架用的“聚合”类
3 * @author Administrator
4 *
5 */
6 public class BookShelfIterator implements Iterator{
7
8 private BookShelfbookShelf;
9 private int index;
10
11 public BookShelfIterator(BookShelfbookShelf){
12 this .bookShelf = bookShelf;
13 this .index = 0 ;
14 }
15
16
17 @Override
18 public boolean hasNext(){
19 // TODOAuto-generatedmethodstub
20 if (index < bookShelf.getLength()){
21 return true ;
22 } else {
23
24 return false ;
25 }
26
27 }
28
29 @Override
30 public Objectnext(){
31 // TODOAuto-generatedmethodstub
32 Bookbook = bookShelf.getBookAt(index);
33 index ++ ;
34
35 return book;
36 }
37
38 }

  做完上面一系列的代码编写之后,我们就可以在Android 的主界面上使用上面的Iterator 遍历出上面给出的需求。

  IteratorPatternsActivity类

public class IteratorPatternsActivity extends Activity{ public static String TAG="IteratorPatternsActivity";
/** Calledwhentheactivityisfirstcreated. */
@Override
public void onCreate(BundlesavedInstanceState){
super .onCreate(savedInstanceState);
setContentView(R.layout.main);


BookShelfbookShelf
= new BookShelf( 5 );

bookShelf.appendBook(
new Book( " androiddeveloper " ))
.appendBook(
new Book( " WindowsPhone7developer " ))
.appendBook(
new Book( " IOSdeveloper " ))
.appendBook(
new Book( " BADAdeveloper " ))
.appendBook(
new Book( " Liondeveloper " ));


Iteratoriterator
= bookShelf.iterator();
while (iterator.hasNext()){
Bookbook
= (Book)iterator.next();
Log.i(TAG, book.getName());

}

}
}

更多的功能扩展

  上面只是讲述了两个功能,hasNext()和Next()方法,想想如果要在这个基础上面扩展将会是多么方便,例如:

  • 由后往前的反向遍历
  • 由前往后、由后往前的双向遍历(Next 、Previous......)
  • 指定一个下标立即得到
  • 等等

更多相关文章

  1. Retrofit
  2. android 百度地图类参考 MKGeneralListener
  3. Android数据库中查找一条数据使用的方法 query详解
  4. Android(安卓)webView与JavaScript的交互
  5. 序列化的两种方式
  6. Android(安卓)应用换肤功能(白天黑夜主题切换)
  7. 通过反射调用Android的L2CAP接口
  8. android系统学习笔记七
  9. delphi xe5 android tts(Text To Speech)

随机推荐

  1. android 数据存储总结及各种存储方式
  2. Android(安卓)获取唯一机器码的代码
  3. Android中获取设备的IP
  4. JAVA如何判断对象的类型
  5. Android实现延时启动页面
  6. Android 错误:IllegalStateException: Can
  7. Android中如何判断Intent是否存在
  8. android textview文字自动排版
  9. Android中view的Touch事件传递顺序
  10. Android(安卓)源码的编译