设计Android的设计模式-生成器模式

生成器模式->也叫创建者模式,是将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。

何时使用:
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();
        })
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值