首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

Android Ap 开发 设计形式第一篇:迭代器模式

2012-06-26 
Android Ap 开发 设计模式第一篇:迭代器模式?转载http://terryblog.blog.51cto.com/1764499/603456?Iterat

Android Ap 开发 设计模式第一篇:迭代器模式

?

转载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?Iterator?iterator();
}

?

  Iterator 接口

?

public?interface?Iterator?{

????public?abstract?boolean?hasNext();????//存在一条则返回true
????????????
????public?abstract?Object?next();????????//移到下一条记录
}

?

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

?

  Book 类

?

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

????private?String?name="";
????public?Book(String?name){
????????this.name=name;
????}
????
????public?String?getName(){
????????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?Book?getBookAt(int?index){
????????return?books[index];
????}
????
????
????public?BookShelf?appendBook(Book?book){?
????????this.books[last]=book;
????????last++;
????????return?this;
????}
????public?int?getLength(){
????????return?this.last;
????}
????
????
????
????@Override
????public?Iterator?iterator()?{
????????//?TODO?Auto-generated?method?stub
????????return?new?BookShelfIterator(this);
????}

}

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

?

  BookShelfIterator 类

?

?1?/**
?2??*?执行扫描书架用的“聚合”类
?3??*?@author?Administrator
?4??*
?5??*/
?6?public?class?BookShelfIterator?implements?Iterator?{
?7?
?8?????private?BookShelf?bookShelf;
?9?????private?int?index;
10?????
11?????public?BookShelfIterator(BookShelf?bookShelf){
12?????????this.bookShelf=bookShelf;
13?????????this.index=0;
14?????}
15?????
16?????
17?????@Override
18?????public?boolean?hasNext()?{
19?????????//?TODO?Auto-generated?method?stub
20?????????if(index<bookShelf.getLength()){
21?????????????return?true;
22?????????}else{
23?????????????
24?????????????return?false;
25?????????}
26?????????
27?????}
28?
29?????@Override
30?????public?Object?next()?{
31?????????//?TODO?Auto-generated?method?stub
32?????????Book?book=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";
????/**?Called?when?the?activity?is?first?created.?*/
????@Override
????public?void?onCreate(Bundle?savedInstanceState)?{
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.main);? ? ??
????????
????????BookShelf?bookShelf=new?BookShelf(5);
????????
????????bookShelf.appendBook(new?Book("android?developer"))
????????.appendBook(new?Book("Windows?Phone?7?developer"))
????????.appendBook(new?Book("IOS?developer"))
????????.appendBook(new?Book("BADA?developer"))
????????.appendBook(new?Book("Lion?developer"));
????????
????????
????????Iterator?iterator=bookShelf.iterator();
????????while(iterator.hasNext()){
????????????Book?book=(Book)iterator.next();
? ? ? ? ? ? Log.i(TAG, book.getName());
????????}
????????????
????}
}

?

?

更多的功能扩展

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

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

热点排行