因?yàn)檫@三個(gè)都比較偏代碼,所以都是以貼出運(yùn)用這些模式的代碼,然后通俗總結(jié)各個(gè)設(shè)計(jì)模式。
Builder設(shè)計(jì)模式
Builder設(shè)計(jì)模式設(shè)計(jì)模式列子代碼如下:
/**
* Created by hcDarren on 2017/9/23.
* 這個(gè)是導(dǎo)航欄的基類(lèi)
*/
public class AbsNavigationBar<B extends AbsNavigationBar.Builder> implements INavigation {
private B mBuilder;
//...代碼省略
/**
* Builder 構(gòu)建類(lèi)
* 構(gòu)建 NavigationBar 還有存儲(chǔ)參數(shù)
*/
public static abstract class Builder<B extends Builder> {
public Context mContext;
//...代碼省略
public Builder(Context context, int layoutId, ViewGroup parent) {
this.mContext = context;
//...代碼省略
}
/**
* 用來(lái)創(chuàng)建 NavigationBar
*
* @return
*/
public abstract AbsNavigationBar create();
/**
* 設(shè)置文本
*
* @param viewId
* @param text
* @return
*/
public B setText(int viewId, String text) {
mTextMaps.put(viewId, text);
return (B) this;
}
/**
* 設(shè)置點(diǎn)擊事件
*
* @param viewId
* @param clickListener
* @return
*/
public B setOnClickListener(int viewId, View.OnClickListener clickListener) {
mCLickListenerMaps.put(viewId, clickListener);
return (B) this;
}
}
}
當(dāng)調(diào)用的時(shí)候會(huì)以一種鏈?zhǔn)叫问剑?/p>
DefaultNavigationBar navigationBar =
new DefaultNavigationBar.Builder(this,parent)
.setLeftText("返回")
.hideLeftText()
.setLeftClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
finish();
}
})
// 還有一些參數(shù)
.create();
總結(jié)
當(dāng)類(lèi)中參數(shù)過(guò)多時(shí),會(huì)有多個(gè)參數(shù)的方法產(chǎn)生。而且以后如果添加參數(shù),對(duì)參數(shù)方法改動(dòng)又比較大。例如以下情況:
class A{
private String a;
private String b;
private String c;
private String d;
private String e;
private String f;
public A(){}
public A(String a){
}
public A(String a, String b){}
public A(String a, String b, String c){}
public A(String a, String b, String c, String d){}
public A(String a, String b, String c, String d){}
public A(String a, String b, String c, String d, String e){}
public A(String a, String b, String c, String d, String e, String f){}
}
Builder模式很好解決了這類(lèi)情況,在拓展和調(diào)用都非常簡(jiǎn)單明了。
模板設(shè)計(jì)模式
在android中,Activity的生命周期就是使用的模板模式:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "ActivityTest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "---onCreate()---");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "---onStart()---");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "---onRestart()---");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "---onResume()---");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "---onPause()---");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "---onStop()---");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "---onDestroy()---");
}
}
各個(gè)生命周期會(huì)按照指定的情景順序調(diào)用,而模板設(shè)計(jì)模式的核心理念也就是這個(gè)。也就是模板方法定義了一個(gè)算法的步驟,并允許子類(lèi)為一個(gè)或多個(gè)步驟提供具體實(shí)現(xiàn)。而我們自己封裝的BaseActivity類(lèi)也是使用了模板模式的概念:
public abstract class BaseActivity extends AppCompatActivity{
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 1. 設(shè)置布局
setContentView();
// 寫(xiě)一些公用的方法,ButterKnife注解,統(tǒng)一管理Activity,等等
// 2. 初始化Title
initTitle();
// 3. 初始化View
initView();
// 4. 訪問(wèn)接口數(shù)據(jù)(initData)
initData(savedInstanceState);
}
protected abstract void initData(Bundle savedInstanceState);
protected abstract void initView();
protected abstract void initTitle();
protected abstract void setContentView();
// 寫(xiě)一大堆方法 ,很多 Activity 都要用的
public void startActivity(Class<? extends BaseActivity> clazz) {
Intent intent = new Intent(this,clazz);
startActivity(intent);
}
}
總結(jié)
模板模式簡(jiǎn)單說(shuō)就是抽象類(lèi)定義一系列順序執(zhí)行的方法,但是具體實(shí)現(xiàn)由子類(lèi)自行決定。
Adapter設(shè)計(jì)模式
適配器設(shè)計(jì)模式,在android用的比較多的就是列表界面List設(shè)置的Adapter了,是很好的例子。
public class ListAdapter implements AdapterTarget {
private List<String> mItems;
private Context context;
public ListAdapter(List<String> items, Context context){
this.mItems = items;
this.context = context;
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public View getView(int position, ViewGroup parent) {
TextView itemView = (TextView) LayoutInflater.from(context)
.inflate(R.layout.item_main,parent,false);
itemView.setText(mItems.get(position));
return itemView;
}
}
而這個(gè)設(shè)計(jì)模式主要就是將我們所得到的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為我們所需要的數(shù)據(jù)類(lèi)型,而中間這個(gè)轉(zhuǎn)換就可以以Adapter設(shè)計(jì)模式進(jìn)行轉(zhuǎn)換。在 ListAdapter 中,就是將原本的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為 ListView 所需要的View類(lèi)型,而這個(gè)過(guò)程通過(guò) ListAdapter 實(shí)現(xiàn),就是使用的 Adapter 設(shè)計(jì)模式。
總結(jié)
Adapter 設(shè)計(jì)模式使用的場(chǎng)景簡(jiǎn)單來(lái)說(shuō)就是當(dāng)我們需要將其他類(lèi)型轉(zhuǎn)換到我們需要的類(lèi)型時(shí)適配時(shí),我們可以通過(guò)編寫(xiě)一個(gè)Apapter類(lèi)來(lái)進(jìn)行轉(zhuǎn)換。這也就是 Adapter 設(shè)計(jì)模式的核心。