1. 程式人生 > >淺談鏈式程式設計及建造者模式

淺談鏈式程式設計及建造者模式

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

在安卓開發中,最早接觸鏈式程式設計,應該算是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的實現方式,是不是覺得很像呢?

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

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

獻上我的Demo原始碼: