淺談鏈式程式設計及建造者模式
今天談談鏈式程式設計,和建造者模式,第一部分談鏈式程式設計,第二部分談建造者模式。
在安卓開發中,最早接觸鏈式程式設計,應該算是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原始碼: