今天谈谈链式编程,和建造者模式,第一部分谈链式编程,第二部分谈建造者模式。
在安卓开发中,最早接触链式编程,应该算是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源码: