前言
模板设计模式系列文章
模板设计模式(一) - 定义及源码中所用到的模板设计模式
模板设计模式(二) - 线程池工作机制
模板设计模式(三) - OkHttp的 Dispatcher(线程池)
1. 模板设计模式定义?
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构就可以重定义该算法的某些特定步骤;
说白了,必须得有继承,父类一般都是流程和通用部分的封装,子类一般都是实现父类的方法,然后实现自己具体的功能;
2. 源码中用到的模板设计模式?
1>:Activity的生命周期
- 首先都是继承自AppCompatActivty,它的流程和规范都已经定义好了,需要我们自己定义的Activity(比如MainActivity、LoginActivity、RegisterActivity等所有Activity)生命周期的流程和规范都要求与AppCompatActivity都是一样的;
- 我们定义的每个Activity都可以定义不同的界面,可以实现具体的逻辑;
2>: AsyncTask
/**
* 除过 doInBackground在子线程执行外,其余都是在主线程中执行
*/
class Task extends AsyncTask{
/**
* 执行耗时操作 线程池
*/
@Override
protected Object doInBackground(Object[] params) {
return null;
}
/**
* 开始执行
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}
/**
* 执行完成 用handler切换到主线程
*/
@Override
protected void onPostExecute(Object object) {
super.onPostExecute(object);
}
/**
* 执行进度
*/
@Override
protected void onProgressUpdate(Object[] values) {
super.onProgressUpdate(values);
}
}
3>:自定义View中的 draw()方法
- ViewGroup是不会调用 onDraw()方法的
- 在View中,调用 dispatchDraw(),是绘制子孩子,不断的循环调用子View的draw()方法,这个方法什么都没写,我们可以根据自己需求去实现
具体的可以参照我之前的文章:
(ST)View的绘制流程 - onDraw()源码分析
4>:BaseActivity
3. 开发中的 BaseActivity
1>:父类 BaseActivity代码如下:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/13 9:46
* Version 1.0
* Params:
* Description: 模板设计模式
*/
public abstract class BaseActivity extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 1. 设置布局
setContentView() ;
/**
* 这个叫做:钩子
* 可以达到子类控制父类,在父类中返回true,子某一个子类中返回false
*/
if (flagTest()) {
// 2. 初始化头部Title
initTitle();
}
// 3. 初始化View
initView() ;
// 4. 访问接口数据
initData(savedInstanceState) ;
}
protected boolean flagTest() {
return true;
}
protected abstract void initData(Bundle savedInstanceState);
protected abstract void initView();
protected abstract void initTitle();
protected abstract void setContentView() ;
public void startActivity(Class<? extends BaseActivity> clazz) {
Intent intent = new Intent(this,clazz);
startActivity(intent);
}
}
2>:子类MainActivity代码如下:
public class MainActivity extends BaseActivity {
@Override
protected void initData(Bundle savedInstanceState) {
}
@Override
protected void initView() {
}
@Override
protected void initTitle() {
}
@Override
protected void setContentView() {
}
/**
* 钩子:达到子类可以控制父类,子类返回false,父类返回true
*/
@Override
protected boolean flagTest() {
return false;
}
}
代码已上传至github
https://github.com/shuai999/Architect_day12.git