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......) 指定一个下标立即得到 等等?