目录java
迭代器模式sql
为何要用迭代器模式数据库
迭代器模式应用实例编程
不知不觉更了12篇,从今天开始近乎天天全满的课程开始了,更新速度也要受到影响。设计模式
迭代器,最先听到这个概念的时候是在大一的时候还对java只知其一;不知其二就去搞Android的时候,接触到的,在用到对于数据库的操做的时候,咱们来得到数据的时候经过 rawQuery执行sql语句来得到数据集返回的就是一个游标实例,Cursor,所以迭代器模式也被称做是游标模式,具体例子和其使用在后面实例部分介绍。数组
迭代器:提供一种方法来遍历集合的同时,又不暴露该集合的底层数据存储的实现。数据结构
咱们常见的集合有不少种类,其顶层数据存储和组织方式的不一样致使了咱们在对数据进行遍历的时候存在一些差别,迭代器模式就是经过实现某种统一的方式来实现对不一样的集合的遍历,同时又不暴露出其底层的数据存储和组织方式。ui
继续咱们造机器的问题,在讲适配器的时候提到了,咱们拥有不止一个商店,并且每一个商店里所出售的货物的种类也是不一样的,惧于马云大大的“不作电子商务将无商可务”,决定不只仅是经过线下的这种销售,在网上也进行出售,网上的店将做为一个集合,集合线下店里全部的产品,当有客户下单,就有具备该上商品的网店进行发货,那么第一个要解决的问题就是我要知道这些商店里都有什么产品,因此须要他们给提供一个货物的种类单,因为不一样的商店,其对商品种类管理使用的数据结构也是不相同的,有的是经过一个数组来存放,由于他们的店里永远只会卖固定种类的货物,而后有一些店里在不停的扩展规模,所以会经过一个可扩展的ArrayList来存放。(固然,现实中不会如此,为了举例方便)而后,如今各个商家给我数据了,并且不止这两种,这个时候头大了。this
开始,这样来实现设计
public class Store{ //用来持有全部菜单条目 public ArrayList<MenuItem>list = new ArrayList<MenuItem>(); public Store(){ } //针对不一样的商店建立不一样的类型 public void getFirstStoreMachines(FirstStoreMenu menu){ MenuItem [] firstStoreMenu = menu.getMenuItems(); for(int i=0; i<firstStoreMenu.length; i++) list.add(firstStoreMenu[i]); } public void getSecondStoreMachines(SecondStoreMenu menu){ ArrayList<MenuItem> secondStoreMenu = menu.getMenuItems(); for(int i=0; i<secondStoreMenu.size(); i++) list.add(secondStoreMenu.get(i)); } //用来展现全部的商品种类 public void display(){ for(int i=0; i<list.size(); i++){ System.out.println(list.get(i).name); } } }
针对每个商店的数据集进行遍历,来得到菜单条目,若是有一百个商店,那么咱们的代码量将变得很大,同时后期的维护也变得很困难了。
这个时候,又到了设计模式大显身手的时候了。经过迭代器模式来给数组和容器包上一层,使得其内部结构对外彻底不可见,从而使得咱们无需针对每种数据结构单独进行遍历操做。代码实例以下。
根据设计模式的基本原则针对接口编程,而不要针对具体类型,so
public interface Iterator{ boolean hasNext(); Object next(); }
看到这两个方法,获取sqlite数据库中的数据的既视感。
而后以前咱们的商店菜单类是这样实现的
public class FirstStoreMenu extends Menu{ MenuItem[] items; public MenuItem[] getFirstStoreMachines{ return items; } }
如今咱们要使用迭代器了,全部要返回一个迭代器了,返回什么样的迭代器,这个迭代器具体要怎么实现呢?
public class FirstMenuIterator implements Iterator{ MenuItem[] items; int position=0; public FirstMenuIterator(MenuItem[] items){ this.items = items; } //向下移动 public Object next(){ MenuItem menuItem = items[position]; position++; return menuItem; } //判断 public boolean hasNext(){ if(position>=items.length||items[position]==null){ return false; }else{ return true; } } } //经过判断和移动的结合实现咱们须要的遍历操做
有了针对咱们商店菜单的迭代器了,那么接下来能够这样写了
public class FirstStoreMenu extends Menu{ MenuItem[]items; public Iterator createIterator(){ return new FirstMenuIterator(items); } }
咱们总店中要如何应用这个迭代器呢?
public class Store{ //用来持有全部菜单条目 public ArrayList<MenuItem>list = new ArrayList<MenuItem>(); public Store(){ } public void addItem(Iterator iterator){ while(iterator.hasNext()) list.add(iterator.next()); } //用来展现全部的商品种类 public void display(){ for(int i=0; i<list.size(); i++){ System.out.println(list.get(i).name); } } }
经过这种方式,咱们不只使得代码变得简洁(Store内的代码),同时也使得咱们的编程针对接口再进行编程。使得store类对各商店菜单类的耦合变低。这样咱们经过addItem方法向Store实例注入依赖实例便可完成对于各个商店的商品的汇总。
上面提到了Android的数据库sqlite得到数据的时候,固然对于数据集的操做迭代器是很经常使用的。
Android中叫它游标,这个称呼更好的反应出了特性,在数据集之上游走。具体代码此处再也不贴出。
边城大神,在文章中提到了一个桥接模式,对于这个模式,桥接模式其思想为,将对象和行为单独封装成类,对象的特征和行为松耦合,而后对象自身并不去实现行为,经过对委托的形式调用行为类,结构上比较像是策略模式的结构。
下篇更新生成器模式,结合Android中的AlertDialog.Builder来谈下