这是我参与更文挑战的第15天,活动详情查看:更文挑战
模板方法模式
在面向对象开发过程中,当遇到执行流程固定,已知每个关键步骤,并且执行顺序流程一致,只是某些步骤具体实现过程是未知的情况。在这种情况下就可以使用模板方式模式去实现。
模板方法模式定义:定义一种操作情况框架,将一些步骤在子类当中实现,在不改变算法框架结构,流程顺序的情况下重新定义特定步骤实现。
实战
模板方法实际上就是封装了一个固定流程,一套执行模板,固定了第一步需要执行什么,第二步需要执行哪些方法。这些都在抽象类中提前设计好,每个步骤都有应该需要去执行的内容。而子类实现中根据自身执行情况在每个步骤过程中处理和实现不同内容。比如以下代码中,定义了抽象类ComputerMainProcess设计了电脑开机过程中几个固定方法,powerOpen打开电源-> checkCPU检查CPU情况 -> loadOS加载电脑系统 -> checkUser检查用户是否合法 -> login最后就是登陆。子类实现中只需要实现上述几个方法在自身算法中做应该做的事情,而对于基础抽象类中的bootUp开机过程方法是final,它就是模板方法中的核心点就是执行步骤固定,逻辑流程是稳定不可修改的。
public abstract class ComputerMainProcess{
protected void powerOpen(){
}
protected void loadOS(){
}
protected void checkCPU(){
}
protected void checkUser(){
}
protected void login(){
}
public final void bootUp(){
powerOpen();
checkCPU();
loadOS();
checkUser();
login();
}
}
public class DellComputer extends ComputerMainProcess{
@override
protected void powerOpen(){
}
@override
protected void loadOS(){
}
....
@override
protected void login(){
}
}
public class AsusComputer extends ComputerMainProcess{
@override
protected void powerOpen(){
...
}
@override
protected void loadOS(){
....
}
....
@override
protected void login(){
.....
}
}
DellComputer dellComputer = new DellComputer();
AsusComputer asusComputer = new AsusComputer();
dellComputer.bootUp();
asusComputer.bootUp();
复制代码
Android当中的模板方法AsyncTask
在Android开发中AsyncTask就是典型模板方法模式,AsyncTask作为父类定义好了异步执行整个流程方法。当子类使用时只需要在异步操作实现每个步骤要做的事情即可,例如在onPreExecute中实现异步操作前的准备工作;在onProgressUpdate获取异步执行过程中的进度值;在onPostExecute返回异步操作结果。当然其中的步骤方法并不表示所有都需要实现,具体还是需要根据业务所需实现需要的步骤算法。
class UseAsynctask extends AsyncTask{
// 执行 线程任务前的操作
@Override
protected void onPreExecute() {
super.onPreExecute();
}
// 接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果
@Override
protected Object doInBackground(Object[] params) {
return null;
}
//在主线程 显示线程任务执行的进度
@Override
protected void onProgressUpdate(Integer... progresses) {
...
}
// 接收线程任务执行结果、将执行结果显示到UI组件
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
}
}
UseAsynctask mTask = new UseAsynctask();
mTask.execute();
复制代码
总结
模板方法核心其实就是流程封装,将固定流程封装到final函数中,子类去具体实现步骤方法。因此对于父类需要设计步骤的公用方法,提高代码复用性,以及更好的扩展性。
模板方法模式的优点:封装不变部分,扩展可变部分。提取公共部分代码,便于维护。