在日常开发中,经常会遇到 将一个方法覆写很多次情况.
原因都是因为第一次开发并没有考虑完善
为了不修改之前调用的代码,只能 将一个方法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 一样的呢.
这样的需求还很多,快自己试试吧!