浅谈链式编程及建造者模式

今天谈谈链式编程,和建造者模式,第一部分谈链式编程,第二部分谈建造者模式。

在安卓开发中,最早接触链式编程,应该算是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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值