概述:相信每个开发人员在开发中都会面临各种复杂的业务逻辑,在解决这些问题时,初级开发人员会注重业务逻辑逐步实现功能,相信也会实现所要求的功能,但对于后期的维护个更新来说会变得相当麻烦,当业务逻辑改变时或是调整时,开发人员甚至会重写才能满足要求,而对于有经验的开发人员来说会首先考虑能否用那种设计模式来实现功能,利用设计模式提高代码的逻辑和扩张性,个人工作几年的经验也证明学习设计模式的重要性,从这篇开始我会每篇介绍一个设计开发模式,算是对自己知识的梳理,希望能帮助需要的人。
一、简介
在开发过程中对于数据集合的遍历很多人都会使用for循环,根据i的坐标逐步输出每个元素,在这里将变量i的作用抽象话后就为今 天要讲的Iterator模式,即迭代器模式。
二、类与接口
- 首先介绍Iterator的登场角色
- Iterator :迭代器,用于遍历元素的接口,她定义了两个方法hasNext()和Next();
- ConcreteIterator:具体的迭代器,该角色实现迭代器的接口,该角色必须包含遍历集合的所需信息
- Aggregate:集合,该角色定义创建Iterator的接口,
- ConcreteAggregate:具体的集合,该集合实现上面的抽象几何,有储存和获取的元素的方法,具有创建具体的Iterator对象
- Bean:储存的对象
我们已书店和图书为例,书架为集合,图书为商品,可以在书架上储存和获取,下面来看看所需的接口和类:
-
- Iterator :Iterator
- ConcreteIterator:BookIterator;
- Aggregate:Aggregate
- ConcreteAggregate:BookStore
- Bean:Book
下面我们创建每个类,并按照上面的要求实现其中的方法:
- Iterator类
interface Iterator { fun hasNext():Boolean fun next() : Any }
包含两个方法hasNext(),用于判断是否有下一个数据,next()获取当前数值并向下移动,返回一个Any
- BookIterator类
class BookIterator(val bookStore: BookStore) : Iterator{ var index = 0 override fun hasNext(): Boolean { return index < bookStore.getLength() } override fun next(): Any { val book = bookStore.getBook(index) index ++ return book } }实现其两个接口方法,因为要遍历集合,所以此处要传入一个bookstore的对象,在hasNext中根据集合的下表判断是否有下一个数据,在next方法中返回数据并将index向下移动。
- Aggregate:集合接口
interface Aggregate { fun iterator() : Iterator }
- BookStore:具体的集合类,提供储存方法和创建迭代器
class BookStore : Store { var list = mutableListOf<Book>() override fun iterator(): Iterator { return BookIterator(this@BookStore) } fun addBook(book: Book) { list.add(book) } fun getBook(int: Int) : Book { return list[int] } fun getLength():Int{ return list.size } }
此处创建一个list保存数据,getBook用于获取数据,addBook用于添加数据,iterator方法创建迭代器对象
- Book 书籍实体类
data class Book(val name: String ,val money : Int)
三、代码调用
bookStore = BookStore() bookStore.run { for (i in 1..5){ bookStore.addBook(Book("Android",i*10)) } } val iterator = bookStore.iterator() while (iterator.hasNext()){ val book : Book= iterator.next() as Book Log.e("book===",book.name + "=="+book.money) }
先向集合中添加五个数据,在用刚才的迭代器遍历数据,输出结果:
03-25 13:39:56.056 2962-2962/com.example.wuliangliang.designmodel E/book===: Android==10 03-25 13:39:56.056 2962-2962/com.example.wuliangliang.designmodel E/book===: Android==20 03-25 13:39:56.056 2962-2962/com.example.wuliangliang.designmodel E/book===: Android==30 03-25 13:39:56.056 2962-2962/com.example.wuliangliang.designmodel E/book===: Android==40 03-25 13:39:56.056 2962-2962/com.example.wuliangliang.designmodel E/book===: Android==50
四、拓展思考
- 为什么使用iterator ?
while (iterator.hasNext()){ val book : Book= iterator.next() as Book Log.e("book===",book.name + "=="+book.money) }
这里只使用了Iterator的方法,并没有使用BookStroe的任何方法,实现了遍历和集合的解耦
- 为什么使用Aggregate和Iterator接口
有人可能认为这里的BookStore和BookIterator的具体类便可以实现更能,为什么还要两个集合呢?对于这样的同学只想使用具体的类解决实际的方法,可这样的话就将这几个类耦合和限定在一起了,没有实现操作逻辑和数据的解耦,进而使类更加容易被当作组件再次利用。
好了,今天的设计模式就到这里了,希望大家今后在工作过程中能更好的使用设计模式,慢慢你就会发现设计模式真的很强大,简单的道理可以实现很多复杂的功能。