淺談鏈式編程及建造者模式

今天談談鏈式編程,和建造者模式,第一部分談鏈式編程,第二部分談建造者模式。

在安卓開發中,最早接觸鏈式編程,應該算是AlertDialog類了,後來在github上看到JakeWharton 的picasso圖片處理框架。從ViewpageIndicator開始關注JakeWharton ,當時對他的佩服是無比的,覺得他想讓我們用什麼風格寫代碼,就能給我們創造出相應的框架,注意,重點是風格哦。


說回正題,其實安卓中從AlertDialog.Builder的源碼中,能窺得一斑,所以今天來依葫蘆畫瓢。

新建一個Chaincode工程。 裏面兩個類Mainactivity / Builder ,一個佈局文件(如下圖);


這裏寫圖片描述

佈局就不多說了。
接下來是Builder 類:

public class Builder {

    //build的主體
    private String mProduct;

    //構造方法,傳入一個初始的主體,留給調用該類者使用
    public Builder(String init) {
        mProduct = init;
    }

    public Builder setname(String name) {
         mProduct = mProduct + "名字是" + name + ",\n";
         return this;
    }

    public Builder setage(String age) {
         mProduct = mProduct + "年齡是" + age + ",\n";
         return this;
    }

    public Builder setheight(String height) {
        mProduct = mProduct + "身高是" + height + ",\n";
        return this;
    }

    public Builder setweight(String weight) {
        mProduct = mProduct + "體重是" + weight + ",\n";
        return this;
    }

    public Builder setdream(String dream) {
         mProduct = mProduct + "夢想是" + dream + ",\n";
         return this;
    }

    //show 出經過建造的主體
    public String show() {
        return mProduct;
    }
}

代碼很簡單,相信都看得懂,主要是各個set方法的返回值,我覺得很巧妙,返回的是這個類本身的實例,正是因爲這個設定後面才能實現鏈式編程


然後在MainActivity類中,調用如下代碼:

   /**
     * 代碼編寫時,直接用.鏈接方法,實現鏈式編程
     */
    private void DoProduct() {
        new Builder("建造的產品").setname("張三")
                .setage("18歲")
                .setheight("180cm")
                .setweight("45kg")
                .setdream("happy coding")
                .show();
    }

有沒有覺得.set().set().set()…這樣寫代碼很清爽。當然這裏只是淺談,做個Demo,真正的鏈式編程,在方法設定上還是要考慮很多東西的,各位自己去開腦洞吧。


好了,到目前爲止,本文第一部分,鏈式編程,算講完了,下面是第二部分,粗談建造者模式

個人認爲,建造者模式的核心思想是:就像一個流水線,把流程固定,流程當中各個具體的實現細節不關心,它只關心進出兩端而已。

以下是MainActivity的代碼:

public class MainActivity extends Activity implements OnClickListener {

    // 聲明控件
    private EditText mEdtName, mEdtAge, mEdtHeight, mEdtWeight, mEdtDream;
    private Button mBtnName, mBtnAge, mBtnHeight, mBtnWeight, mBtnDream, mBtnFinish;
    private TextView mTxtProduct;

    // 初始化要建造的產品
    private String mProduct = "建造的產品:\n";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    /*
     * 初始化控件
     */
    private void initView() {
        mEdtName = (EditText) findViewById(R.id.edt_name);
        mEdtAge = (EditText) findViewById(R.id.edt_age);
        mEdtHeight = (EditText) findViewById(R.id.edt_height);
        mEdtWeight = (EditText) findViewById(R.id.edt_weight);
        mEdtDream = (EditText) findViewById(R.id.edt_dream);
        mBtnName = (Button) findViewById(R.id.btn_name);
        mBtnAge = (Button) findViewById(R.id.btn_age);
        mBtnHeight = (Button) findViewById(R.id.btn_height);
        mBtnWeight = (Button) findViewById(R.id.btn_weight);
        mBtnDream = (Button) findViewById(R.id.btn_dream);
        mBtnFinish = (Button) findViewById(R.id.btn_finish);
        mTxtProduct = (TextView) findViewById(R.id.txt_product);

        mBtnName.setOnClickListener(this);
        mBtnAge.setOnClickListener(this);
        mBtnHeight.setOnClickListener(this);
        mBtnWeight.setOnClickListener(this);
        mBtnDream.setOnClickListener(this);
        mBtnFinish.setOnClickListener(this);

        //鏈式編程建造產品
        //DoProduct();
    }

    /**
     * 代碼編寫時,直接用.鏈接方法,實現鏈式編程
     */
    private void DoProduct() {
        new Builder("建造的產品").setname("張三")
                .setage("18歲")
                .setheight("180cm")
                .setweight("45kg")
                .setdream("happy coding")
                .show();
    }

    /**
     * 界面演示建造者思想
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_name:
            mProduct = mProduct + "名字是" + mEdtName.getText().toString() + "\n";
            break;
        case R.id.btn_age:
            mProduct = mProduct + "年齡是" + mEdtAge.getText().toString() + "\n";
            break;
        case R.id.btn_height:
            mProduct = mProduct + "身高是" + mEdtHeight.getText().toString() + "\n";
            break;
        case R.id.btn_weight:
            mProduct = mProduct + "體重是" +mEdtWeight.getText().toString() + "\n";
            break;
        case R.id.btn_dream:
            mProduct = mProduct + "夢想是" + mEdtDream.getText().toString() + "\n";
            break;
        case R.id.btn_finish:
            mTxtProduct.setText(mProduct);
            mProduct = "";
            break;
        }
    }

來個圖,各位就很明瞭了。

這裏寫圖片描述

可以看到,我可以完整的創建一個有名字、年齡、身高、體重、夢想的 產品。 也可以只創建一個只有名字、身高、體重的產品。
建造的順序也是可以調換的。
我們只關心的是,開始建造和建造完成,這兩個步驟,中間各個屬性傳的是什麼值,什麼流程,都是任意的。

這就是建造者模式的優點。對比安卓中AlertDialog的實現方式,是不是覺得很像呢?

哈哈,本文只是拋磚引玉,具體裏面的實現還是值得認真探究的,

具體的建造者思想,可以參考這篇文章,http://blog.csdn.net/zhengzhb/article/details/7375966

好了,近期可能會比較多涉及一些設計模式,各位看官不妨也多關注關注思想層面上的設計,我們不僅要happy coding ,更要做一個有思想的coder


獻上我的Demo源碼:

源碼下載: http://download.csdn.net/detail/lebang08/9619807

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章