Builder設(shè)計(jì)模式,模板設(shè)計(jì)模式,Adapter設(shè)計(jì)模式筆記

因?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ì)模式的核心。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容