生成器模式->也叫创建者模式,是将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。
何时使用:
1.当系统准备为用户提供一个内部结构复杂的对象,而且在构造方法中编写创建该对象的代码无法满足用户需求时,就可以使用生成器模式去构造这样的对象。
2.当某些系统要求对象的构造过程必须独立于创建该对象的类时。
优点:
1.生成器模式将对象的构造过程封装在具体的生成器中,用户使用不同的具体生成器就可以得到该对象的不同表示。
2.生成器模式将对象的构造过程从创建该对象的类中分离出来,使用户无须了解该对象的具体组件。
3.可以更加精细有效的控制对象的构造过程。生成器将对象的构造过程分解成若干步骤,这就是程序可以更加精细,有效的控制整个对象的构造。
4.生成器模式将对象的构造过程与创建该对象类解耦,是对象的创建更加灵活有弹性。
5.当增加新的具体的生成器是,不必修改指挥者的代码,即该模式满足开-闭原则。
使用场景:
1.自定义提示弹窗
/**
* 提示框,布局就自己补了
* Dialog 默认显示标题,内容,取消按钮,确认按钮
* 标题默认黑色,同容默认黑灰色
**/
public class TipDialog extends Dialog {
private TextView tvTitle;
private TextView tvTip;
private TextView btnCancel;
private TextView btnConfirm;
public TipDialog(TipDialog.Builder builder) {
super(builder.getContext());
setContentView(R.layout.dialog_tip);
LayoutParams params = getWindow.getAttributes();
params.width = ScreenUtil.getScreenWidth(mContext) * 7 / 8;
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.CENTER;
getWindow.setAttributes(params);
getWindow.setBackgroundDrawable(new ColorDrawable(0));
// 去除Holo主题的蓝色线条
try {
val dividerID = getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
View divider = findViewById<View>(dividerID);
divider.setBackgroundColor(Color.TRANSPARENT);
} catch (e: Exception) {
e.printStackTrace();
}
setCanceledOnTouchOutside(false);
initDialog(builder);
}
private void initDialog(Builder builder) {
tvTitle = findViewById(R.id.tv_title);
tvTip = findViewById(R.id.tv_tip);
btnCancel = findViewById(R.id.btn_cancel);
btnConfirm = findViewById(R.id.btn_confirm);
// 标题
if (builder.isShowTitle && builder.title != null) {
tvTitle.setVisibility(View.VISIBLE);
tvTitle.setText(builder.title);
} else {
tvTitle.setVisibility(View.GONE);
}
if (builder.titleColor != 0) {
tvTitle.setTextColor(builder.titleColor);
}
// 内容
tvTip.setText(builder.tip);
if (builder.tipColor != 0) {
tvTip.setTextColor(builder.tipColor);
}
// 取消按钮
if (builder.isShowCancel) {
btnCancel.setVisibility(View.VISIBLE);
if (builder.cancelName != null) {
btnCancel.setText(builder.cancelName);
}
} else {
btnCancel.setVisibility(View.GONE);
}
if (builder.cancelColor != 0) {
btnCancel.setTextColor(builder.cancelColor);
}
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
if (builder.onCancelListener != null) {
builder.onCancelListener.onBtnClick(v);
}
}
});
// 确认按钮
if (builder.confirmName != null) {
btnConfirm.setText(builder.confirmName);
}
if (builder.confirmColor != 0) {
btnConfirm.setTextColor(builder.confirmColor);
}
btnConfirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
if (builder.onConfirmListener != null) {
builder.onConfirmListener.onBtnClick(v);
}
}
});
}
/**
* 生成器,生成显示框的内容,这里的生成器同时办演了抽象生成器和指挥者角色
**/
public class Builder {
private Context mContext;
// 是否显示标题
public boolean isShowTitle = true;
// 标题内容
public String title = null;
// 标题颜色
public int titleColor = 0;
// 提示内容
public String tip = null;
// 内容颜色
public int tipColor = 0;
// 是否显示取消按钮
public boolean isShowCancel = true;
// 取消按钮
public String cancelName = null;
// 取消按钮颜色
public int cancelColor = 0;
// 取消按钮事件
public TipDialog.OnBtnClickListener onCancelListener;
// 确认按钮
public String confirmName = null;
// 确认按钮颜色
public int confirmColor = 0;
// 确认按钮事件
public TipDialog.OnBtnClickListener onConfirmListener;
public Builder(Context context) {
this.mContext = context;
}
public Context getContext() {
return mContext;
}
// ================== 下面的内容都是具体的生成器内容 ===================
// 显示标题
Builder showTitle(boolean isShow) {
this.isShowTitle = isShow;
return this;
}
// 标题
Builder setTitle(String title) {
this.title = title;
return this;
}
// 标题
Builder setTitle(@StringRes int titleRes) {
this.title = mContext.getString(titleRes);
return this;
}
// 标题颜色
Builder setTitleColor(@ColorRes int colorRes) {
this.titleColor = ContextCompat.getColor(mContext, colorRes);
return this;
}
// 内容
Builder setTip(String tip) {
this.tip = tip;
return this;
}
// 内容
Builder setTip(@StringRes int tipRes) {
this.tip = mContext.getString(tipRes);
return this;
}
// 内容颜色
Builder setTipColor(@ColorRes int colorRes) {
this.tipColor = ContextCompat.getColor(mContext, colorRes);
return this;
}
// 显示取消按钮
Builder showCancelBtn(boolean isShow) {
this.isShowCancel = isShow;
return this;
}
// 取消按钮
Builder setCancelBtn(String btnName) {
this.cancelName = btnName;
return this;
}
// 取消按钮
Builder setCancelBtn(@StringRes int btnName) {
this.cancelName = mContext.getString(btnName);
return this;
}
// 取消按钮
Builder setCancelColor(@ColorRes int colorRes) {
this.cancelColor = ContextCompat.getColor(mContext, colorRes);
return this;
}
// 取消按钮
Builder setOnCancleListener(TipDialog.OnBtnClickListener listener) {
this.onCancelListener = listener;
return this;
}
// 确认按钮
Builder setConfirmBtn(String btnName) {
this.confirmName = btnName;
return this;
}
// 确认按钮
Builder setConfirmBtn(@StringRes int btnName) {
this.confirmName = mContext.getString(btnName);
return this;
}
// 确认按钮
Builder setConfirmColor(@ColorRes int colorRes) {
this.confirmColor = ContextCompat.getColor(mContext, colorRes);
return this;
}
// 确认按钮
Builder setOnConfirmListener(TipDialog.OnBtnClickListener listener) {
this.onConfirmListener = listener;
return this;
}
/**
* 指挥者,生成具体的提示框
**/
public TipDialog build() {
return TipDialog(this);
}
/**
* 指挥者,生成具体的提示框
**/
public TipDialog show() {
TipDialog dialog = build();
dialog.show();
return dialog;
}
}
// 点击事件
public interface OnBtnClickListener {
void onBtnClick(View v);
}
}
/**
* 退出登录弹窗
**/
public class SettingActivity extends Activity {
// ...
private void initView() {
btnLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showLogout();
}
});
}
private void showLogout() {
new TipDialog.Builder(this)
.setTitle("温馨提示")
.setTip("您是否要确认退出登录吗?")
.setCancelBtn("否")
.setConfirmBtn("是")
.setOnConfirmListener(new TipDialog.OnBtnClickListener() {
@Override
public void onBtnClick(View v) {
// toLogout
}
.show();
})
}
/**
* 显示错误信息,不显示标题,不显示取消按钮
**/
private void showError(String errMsg) {
new TipDialog.Builder(this)
.showCancel(false)
.setTip(errMsg)
.show();
})
}
}