Android 快速实现一个构造者模式

在日常开发中,经常会遇到 将一个方法覆写很多次情况.
原因都是因为第一次开发并没有考虑完善
为了不修改之前调用的代码,只能 将一个方法copy一次,然后重新开一个一样的方法 ,只为了一点点小改动 .
这样虽然能解决问题.但是时间长了,代码将巨恶心.无法维护

下面给大家上一段建造者模式的代码:

代码不全,仅供学习交流使用

CalendarBuild .java

/**
 * Description: 建造者模式demo
 * Author 雷钊
 * Date 2018/1/9 11:40
 */
public class CalendarBuild {

    private Activity mActivity;          // 显示对话框的Activity
    private String mMinimumTime;         // 可以选择的最小时间
    private String mMaximumTime;         // 可以选择的最大时间
    private String mDefultTime;          // 初始化默认显示时间
    private View mTextView;              // 用来设置确认之后文本的view (不仅仅是Textview)
    private int mShowMode;               // 显示的模式 YY-MM ...

    private CustomDatePicker.ResultHandler mCallBackHandler;    //回调

    private CalendarBuild() {
    }

    /**
     * 建造 一个 CalendarBuild
     *
     * @return
     */
    public static CalendarBuild build() {
        return new CalendarBuild();
    }

    public CalendarBuild setMinimumTime(String mMinimumTime) {
        this.mMinimumTime = mMinimumTime;
        return this;
    }

    public CalendarBuild setMaximumTime(String mMaximumTime) {
        this.mMaximumTime = mMaximumTime;
        return this;
    }

    public CalendarBuild setDefultTime(String mDefultTime) {
        this.mDefultTime = mDefultTime;
        return this;
    }


    /**
     * 设置Activity
     *
     * @param mActivity
     * @return
     */
    public CalendarBuild setAcivity(Activity mActivity) {
        this.mActivity = mActivity;
        return this;
    }

    /**
     * 设置用来添加点击与显示返回日期的view
     *
     * @param mTextView
     * @return
     */
    public CalendarBuild setTextView(View mTextView) {
        this.mTextView = mTextView;
        return this;
    }

    /**
     * 设置显示模式
     *
     * @param mShowMode
     * @return
     */
    public CalendarBuild setShowMode(int mShowMode) {
        this.mShowMode = mShowMode;
        return this;
    }

    /**
     * 设置回调
     * @param mCallBackHandler
     * @return
     */
    public CalendarBuild setCallBackHandler(CustomDatePicker.ResultHandler mCallBackHandler) {
        this.mCallBackHandler = mCallBackHandler;
        return this;
    }

    /**
     * 最后一步-开始将前面传入的参数,设置到点击事件中
     * @return
     */
    public CalendarBuild setDefultOnClickListener() {
        if (mTextView == null) {
            throw new RuntimeException("mTextView == null");
        }

        if (mTextView instanceof TextView
                || mTextView instanceof EditText) {
            mTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    show();
                }
            });
        } else if (mTextView instanceof EditLayout) {
            ((EditLayout) mTextView).setOnItemClickListener(new OnItemEditListener() {
                @Override
                public void onClick(String s, boolean b) {
                    show();
                }
            });
        }
        return this;
    }

    /**
     * 展示对话框
     */
    public CalendarBuild show() {
        checkData();
        if (mActivity == null) {
            throw new RuntimeException("mActivity == null ");
        }
        CustomDatePicker time = new CustomDatePicker(mActivity, new CustomDatePicker.ResultHandler() {
            @Override
            public void handle(String time) { // 回调接口,获得选中的时间
                try {
                    if (mTextView != null) {
                        if (mTextView instanceof EditLayout) {
                            ((EditLayout) mTextView).setText(time);
                        } else if (mTextView instanceof EditText) {
                            ((EditText) mTextView).setText(time);
                        } else if (mTextView instanceof TextView) {
                            ((TextView) mTextView).setText(time);
                        }
                    }
                    if (mCallBackHandler != null) {
                        mCallBackHandler.handle(time);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }, mMinimumTime, mMaximumTime); // 初始化日期格式请用:yyyy-MM-dd HH:mm,否则不能正常运行
        time.showSpecificTime(mShowMode);
        time.setIsLoop(true); // 允许循环滚动
        time.show(mDefultTime);
        return this;
    }


    /**
     * 检查数据是否完整,不完整都赋初始值
     */
    private void checkData() {
        if (TextUtils.isEmpty(mMinimumTime)) {
            mMinimumTime = "1910-01-01 00:00";
        }
        if (TextUtils.isEmpty(mMaximumTime)) {
            mMaximumTime = "2020-12-31 23:59";
        }
        if (TextUtils.isEmpty(mDefultTime)) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            mDefultTime = sdf.format(new Date());
        }
        if (mShowMode == 0) {
            mShowMode = CustomDatePicker.ALL;
        }

    }
}

OK,代码上完
再发下调用的代码吧

 CalendarBuild.build()
                    .setAcivity(BasePovertyActivity.this)
                    .setTextView(mTvEndTime)
                    .setMinimumTime("1991-01-01 00:00")
                    .setMaximumTime("2020-12-31 23:59")
                    .setDefultTime("2018-01-01 00:00")
                    .setShowMode(CustomDatePicker.Y_M)
                    .setCallBackHandler(mEndChoosingTimeCallback)
                    .setDefultOnClickListener();

一个 CalendarBuild.build() ,后面跟着一顿….调用!
是不是跟现在流行的 Glide 还有 RxJava 一样的呢.
这样的需求还很多,快自己试试吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值