备忘录模式
1、备忘录模式介绍
一种行为模式 ,用于保存对象当前状态,并且在之后可以恢复到此前状态,有一点需要保证的是保证被保存的对象状态不能被对象从外部访问,在不破坏封闭的前提下,保存和恢复状态
2、备忘录模式的使用场景
(1)需要保存一个对象在某一个时刻的状态或部分状态
(2)如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态
3、备忘录模式的组成
(1)Originator : 负责创建一个备忘录,可以记录、恢复自身的内部状态,可以决定存储自身的哪些内部状态
(2)Memento : 备忘录角色,用于存储状态,防止Originator以外对象访问
(3)CareTaker:负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象
简单来说就是CareTaker控制Memento备忘录角色相当于游戏存储,Originator就是相当于游戏控制台
4、Andriod源码中的备忘录模式
可以很自然联系到Andriod中的状态保存,由两个方法onSaveInstanceState 和 onRestoreInstanceState ,这两个方法在Activity不是正常方式退出,开发人员能够在某些特殊场景存储与界面相关的信息,提升用户体验,Activity扮演CareTaker角色,负责存储、恢复UI的状态信息;Activity、Fragment、View、ViewGroup等对象为Originator,Bundle则扮演Memoto
使用V4包存储状态的bug
5、备忘录模式的优缺点
优点:给用户提供了一种可以恢复的机制,可以使用户能够比较方便回到某个历史状态
实现了信息的封装,使得用户不需要关心状态的保护细节
缺点:消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存
迭代器模式
1、迭代器模式介绍
迭代器模式又称为游标模式,是行为型设计模式之一,迭代器模式源于对容器的访问,比如List、Map、数组等的访问,对容器对象访问必然会涉及遍历算法,我们将遍历方法封装到容器中,容器类承担了过多的功能,如果让使用者自己去实现,又会让容器内部细节暴露无遗。
迭代器模式提供一个方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示
2、迭代器模式使用场景
遍历一个容器对象时
3、迭代器模式的组成
(1)Iterator 迭代器接口 迭代器接口负责定义、访问和遍历元素的接口
(2)Concrete Iterator 具体迭代器类
(3)Aggregate 容器接口
(4)Concrete Aggregate 具体容器接口
4、迭代器模式简单实现
(1)首先定义一个迭代器接口
(2)然后在容器类的接口,在该接口中定义一个能够返回容器迭代器的方法
5、Andriod源码中的模式实现
最为典型的例子查询SQLLiteDatebase中query方法查询数据库,会返回Cursor游标对象
6、迭代模式优缺点
优点:支持以不同的方式去遍历一个容器对象,弱化了容器类与遍历算法之间的关系
缺点:类文件的增加
几乎每一种高级语言都有相应的内置实现,对于开发者而言,已经很少由自己来实现迭代器
模板方法模式
1、模板方法模式介绍
我们执行程序的流程是固定的,我们则可以使用模板方法模式,方法是定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
2、模板方法模式的使用场景
(1)多个子类有公有的方法,并且逻辑基本相同时
(2)重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
(3)重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为
3、模板方法模式基本组成
模板方法模式的组成比较简单,由一个抽象类定义了一套算法框架,然后由这个抽象类衍生出具体实现类
就比如在开机流程中步骤,可以将startUp改为final方法,这样就保证了逻辑流程不能被子类修改,子类只能够改变某一步骤的具体实现,保证了这个逻辑流程的稳定性
4、Andriod源码中的模板方法模式
AsyncTask异步处理,在整个执行过程是一个框架,调用execute后会执行onPreExecute、doInBackgroud、onPostExecute以及活动的生命周期
5、模板方法模式总结
模板方法模式用四个字概括:流程封装。也就是把某个固定的流程封装到一个final函数中,并且让子类能够定制这个流程中的某些或者所有步骤,提升代码复用率,同时也带来了更好的拓展性
优点:封装不变部分,拓展可变部分
提取公共部分代码,便于维护
缺点:模板方法会带来代码阅读的难度,会让用户觉得难以理解