小白自我提高学习设计模式笔记—模板模式
Posted 好人静
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小白自我提高学习设计模式笔记—模板模式相关的知识,希望对你有一定的参考价值。
前言
结合着android源码把所有的设计模式总结一下。
小白自我提高学习设计模式笔记(三)—装饰者模式在Android开发的小试
小白自我提高学习设计模式笔记(五)—模板模式
在小白自我提高学习设计模式笔记(四)—责任链模式中通过模板模式将所有的ConcreteHandler将每个ConcreteHandler的逻辑进行模板化。
一 模板模式
1.定义
模板模式(Template Pattern):通过抽象类来定义执行行为的方式或模板。子类只需要复写该抽象类就可以实现该行为的整个执行过程。
行为型模式。
主要组成部分:
- (1)抽象类/抽象模板(Abstract Class):抽象模板类,负责实现行为的轮廓或骨架。有模板方法和若干基本方法组成。
- 模板方法:定义了行为的骨架,里面实现了调用基本方法的逻辑;为了防止恶意操作,一般模板方法都会加上final关键词;
- 基本方法:构成行为的每个步骤,其中可以为:
- 抽象方法:子类必须复写,用来实现子类自己的逻辑;
- 钩子方法:通常给到是一个空方法,主要是用于判断的逻辑方法或需要子类复写的空方法,例如可以在模板方法的调用期间增加一个调用钩子方法,那么当子类复写该方法的时候,就可以增加到了整个行为执行过程,和抽象方法的区别在于子类不一定需要实现;
- 具体方法:辅助其他方法的方法,子类不需要实现或复写
- (2)具体实现类(Concrete Class):具体的实现类。继承抽象类/抽象模板。实现父类的抽象方法和钩子方法。
2.优缺点
优点
- (1)将公共部分提取成抽象方法,提高代码复用,便于维护;
- (2)将不变部分封装到父类实现,子类扩展可变部分,子类也可通过扩展方式增加其他功能;
- (3)父类实现具体的行为,子类无需关心具体逻辑。
缺点
- (1)每个不同的实现都需要一个子类来实现,使得系统类膨胀;
- (2)父类修改抽象方法,所有的子类都需要修改。
3.与策略模式区别
- (1)策略模式和模板模式都是用来封装算法的,而策略模式用的是组合,而模板模式使用的是继承;
- (2)策略模式关注的是多种算法;而模板模式关注的是一种算法
二 应用场景
模板模式主要用来解决下面的问题:
- (1)有多个子类共有方法,且逻辑相同
- (2)重要复杂方法可以有模板方法来计算核心内容,细节功能通过子类实现
1.在Android开发中的应用
在小白自我提高学习设计模式笔记(四)—责任链模式中的3.对APP启动逻辑的优化在每个具体的ConcreteHandler的时候由于有共同的特点:都是需要判断下符合该业务逻辑的则交给本业务逻辑的ConcreteHandler进行处理,否则转交给下一个Handler进行处理,并且都需要有一个判断跳转的条件,所以将所有的ConcreteHandler进行模板化:
- (1)模板方法handlerAppLauncherEvent()
将上述的逻辑放到模版方法handlerAppLauncherEvent()中,代码如下:
@Override
//模版方法
final public void handlerAppLauncherEvent(Activity context) {
//符合该条件的直接交给该Handler进行处理
if (isSelfAppLauncherEventHandler(context)) {
Log.v(String.format("~~~~~~~~~~~~ 进入到 \\"%s\\" 处理逻辑", getClass().getSimpleName()));
handlerSelfAppLauncherEvent(context);
return;
}
Log.d(String.format("~~~~~~~~~~~~ 交给下一个 \\"%s\\" 处理逻辑", getClass().getSimpleName()));
//否则交给下一个Handler进行处理
goToNextAppLauncherEventHandler(context);
}
可以看到这个模版方法中实现了根据是否符合本业务逻辑的条件,将具体的处理过程交给本ConcreteHandler还是下一个Handler
- (2)基本方法中的抽象方法handlerSelfAppLauncherEvent()
每个具体的ConcreteHandler必须要实现handlerSelfAppLauncherEvent(),用于处理本ConcreteHandler的业务逻辑
/**
* 显示本Handler处理的广告逻辑
*/
//基本方法
public abstract void handlerSelfAppLauncherEvent(Activity context);
具体的代码已经上传到github:地址为https://github.com/wenjing-bonnie/pattern.git的com.android.pattern.template下的相关代码。 可结合小白自我提高学习设计模式笔记(四)—责任链模式看这些代码
2.在Android源码的模板模式
(1)Android源码中的AsyncTask类
在Android源码中的AsyncTask类采用的就是模板模式。可以通过创建一个AsyncTask类轻松实现子线程的操作。当执行task.execute()会依次调用onPreExecute()、 doInBackground()、onPostExecute(),并且可以通过在onProgressUpdate()来更新进度,整个执行过程就是一个模板模式的体现。
但是从Android11开始,该API废弃,推荐使用Executor、ThreadPoolExecutor、FutureTask或者kotlin的协程Coroutines。官方指出在使用AsyncTask类的时候,容易造成context内存泄漏、回调失败或则在改变配置的时候造成崩溃。
遗留问题:ThreadPoolExecutor、FutureTask两个区分。
(2)Activity生命周期加载
在Android 跨进程通信-(三)Binder机制之Client的三 从Native看APP进程的初始化中在APP进程加载过程中会执行ActivityThread的main()函数的时候会通过消息循环队列的方式,依次加载Activity的生命周期方法。同样也是采用模版方式。
三 总结
模板模式在平时用的还是比较多的,简单总结下:
- 1.模板模式主要通过抽象类来定义执行行为的方式或者模板,子类只需要继承抽象类就可以拥有该行为;
- 2.模板模式主要有模板方法和基本方法组成:
- (1)模板方法:实现了行为的主要逻辑,为了防止恶意修改,通常加上final;
- (2)基本方法:抽象方法、钩子方法和具体方法。其中抽象方法必须复写,钩子方法通常是一个空方法,可选择复写,具体方法通常不复写
- 3.模板模式主要作用就是将通用的部分抽象成抽象方法,提高代码复用率;
- 4.将不变的部分封装到父类,子类只需要实现变化的部分
以上是关于小白自我提高学习设计模式笔记—模板模式的主要内容,如果未能解决你的问题,请参考以下文章