前言
模板設(shè)計模式系列文章
模板設(shè)計模式(一) - 定義及源碼中所用到的模板設(shè)計模式
模板設(shè)計模式(二) - 線程池工作機制
模板設(shè)計模式(三) - OkHttp的 Dispatcher(線程池)
1. 模板設(shè)計模式定義斤儿?
定義一個操作中的算法的框架凌受,而將一些步驟延遲到子類中耻台。使得子類可以不改變一個算法的結(jié)構(gòu)就可以重定義該算法的某些特定步驟碳竟;
說白了,必須得有繼承漾岳,父類一般都是流程和通用部分的封裝,子類一般都是實現(xiàn)父類的方法粉寞,然后實現(xiàn)自己具體的功能尼荆;
2. 源碼中用到的模板設(shè)計模式?
1>:Activity的生命周期
- 首先都是繼承自AppCompatActivty唧垦,它的流程和規(guī)范都已經(jīng)定義好了捅儒,需要我們自己定義的Activity(比如MainActivity、LoginActivity振亮、RegisterActivity等所有Activity)生命周期的流程和規(guī)范都要求與AppCompatActivity都是一樣的巧还;
- 我們定義的每個Activity都可以定義不同的界面,可以實現(xiàn)具體的邏輯坊秸;
2>: AsyncTask
/**
* 除過 doInBackground在子線程執(zhí)行外麸祷,其余都是在主線程中執(zhí)行
*/
class Task extends AsyncTask{
/**
* 執(zhí)行耗時操作 線程池
*/
@Override
protected Object doInBackground(Object[] params) {
return null;
}
/**
* 開始執(zhí)行
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}
/**
* 執(zhí)行完成 用handler切換到主線程
*/
@Override
protected void onPostExecute(Object object) {
super.onPostExecute(object);
}
/**
* 執(zhí)行進度
*/
@Override
protected void onProgressUpdate(Object[] values) {
super.onProgressUpdate(values);
}
}
3>:自定義View中的 draw()方法
- ViewGroup是不會調(diào)用 onDraw()方法的
- 在View中,調(diào)用 dispatchDraw()褒搔,是繪制子孩子阶牍,不斷的循環(huán)調(diào)用子View的draw()方法,這個方法什么都沒寫星瘾,我們可以根據(jù)自己需求去實現(xiàn)
具體的可以參照我之前的文章:
(ST)View的繪制流程 - onDraw()源碼分析
4>:BaseActivity
3. 開發(fā)中的 BaseActivity
1>:父類 BaseActivity代碼如下:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/13 9:46
* Version 1.0
* Params:
* Description: 模板設(shè)計模式
*/
public abstract class BaseActivity extends AppCompatActivity {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 1. 設(shè)置布局
setContentView() ;
/**
* 這個叫做:鉤子
* 可以達到子類控制父類走孽,在父類中返回true,子某一個子類中返回false
*/
if (flagTest()) {
// 2. 初始化頭部Title
initTitle();
}
// 3. 初始化View
initView() ;
// 4. 訪問接口數(shù)據(jù)
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