回头看自己写的东西,大概Android当自己控制的定义,编写代码适用性比较高。但是,看看没有什么技术含量,因此,当在学习设计模式,想想有些东西是否可以改善,例如:

自己定义Dialog是Android应用必须的,系统的控件实在是太难看了。

在构建中,全然是,new完对象之后,须要什么构建什么。这样写没有问题。可读性也还行,就是看上去不咋的。

下面是小部分代码片段:

package com.example.demo.Builder;

/**
*
* @author qubian
* @data 2015年6月10日
* @email naibbian@163.com
*
*/
public class BuilderDialog extends Dialog implements View.OnClickListener {
private Context mContext;
private View view;
private View lineView;
private TextView titleTv;
private TextView contentTv;
private Button sureBtn;
private Button cancelBtn;
private String sureTitle;
private String cancelTitle;
private String title;
private String content;
private boolean sureVisible = true;
private boolean cancelVisible = true;
private View.OnClickListener sureListener;
private View.OnClickListener cancelListener; public BuilderDialog(Context context, String title, String content) {
super(context, R.style.base_dialog_style);
this.mContext = context;
this.title = title;
this.content = content;
view = LayoutInflater.from(mContext).inflate(R.layout.dialog_normal,
null);
addContentView(view, Utils.getDialogLayoutParams(mContext));
} public void setSureTitle(String title) {
sureTitle = title;
} public void setCancelTitle(String title) {
cancelTitle = title;
} public void setCancelVisible(boolean visible) {
cancelVisible = visible;
} public void setSureListener(View.OnClickListener listener) {
if (listener != null) {
sureListener = listener;
}
} public void setCancelListener(View.OnClickListener listener) { } /**
* 能否够返回
*
* @param canBack
*/
public void setCanBack(boolean canBack) { }
//初始化
private void initView() {
lineView = view.findViewById(R.id.line_view);
titleTv = (TextView) view.findViewById(R.id.title_tv);
contentTv = (TextView) view.findViewById(R.id.content_tv);
contentTv.setText((content.replace("\\r","\r").replace("\\n", "\n")));
sureBtn = (Button) view.findViewById(R.id.sure_btn);
cancelBtn = (Button) view.findViewById(R.id.cancel_btn);
} @Override
public void show() {
initView();
titleTv.setText(title);
if (sureVisible) {
if (sureListener == null) {
sureBtn.setOnClickListener(this);
} else {
sureBtn.setOnClickListener(sureListener);
}
if (sureTitle != null) {
sureBtn.setText(sureTitle);
}
} else {
sureBtn.setVisibility(View.GONE);
}
if (cancelVisible) { } else { }
super.show();
} @Override
public void onClick(View v) {
if (v.getId() == sureBtn.getId()) {
this.cancel();
} else if (v.getId() == cancelBtn.getId()) {
this.cancel();
}
} }

使用。和适用都没问题,而且逻辑也比較简单,那么怎样优化呢?

言归正传:

建造者模式

1、定义:

将一个复杂的构建与其表示分离,使得同样的构建有了不同的表示。

2、目的:

建造者模式是讲复杂的内部构建封装在内部,对于其它外部成员来说,仅仅须要传递构建者和构建工具。便能够得到所需。不须要关心怎样构建,以及内部构建过程。

3、使用:

3.1、在构建的过程中,同意不同的构建过程。产生不同表示的构建对象;

3.2、在复杂的对象时,其复杂的构建算法应当独立于对象的组成部分,或者是独立于装配方式时;

4、一个简单的demo:

核心:抽象建造者,详细建造者,实体类

package com.example.demo.Builder;

import android.util.Log;
/**
* 建造者模式
* @author qubian
* @data 2015年6月10日
* @email naibbian@163.com
*
*/
public class Product { Builder mBuilder ;
public Builder getBuilder()
{
if (mBuilder==null) {
mBuilder = new ProductBuilder();
}
return mBuilder;
} /**
* 抽象建造者
* @author qubian
* @data 2015年6月10日
* @email naibbian@163.com
*
*/
public interface Builder
{
public Builder buildPart1(); public Builder buildPart2(); public Product getProduct();
}
/**
* 详细的建造者
* @author qubian
* @data 2015年6月10日
* @email naibbian@163.com
*
*/
public class ProductBuilder implements Builder
{
private static final String TAG= "ProductBuilder";
Product mProduct = new Product();
@Override
public Builder buildPart1() {
Log.i(TAG, "buildPart1");
return this; } @Override
public Builder buildPart2() {
Log.i(TAG, "buildPart2");
return this; } @Override
public Product getProduct() { return mProduct;
} } }

使用:

package com.example.demo.Builder;

/**
* 使用
* @author qubian
* @data 2015年6月10日
* @email naibbian@163.com
*
*/
public class UseProduct { public void use()
{
Product p = new Product().getBuilder().buildPart1().buildPart2().getProduct();
} }

5、在Android的源代码中。建造者模式。肯定是不可缺少的;

当中最为代表的就是AlertDialog,在其构建过程中,便是构建与表示分离。

其内部的Builder便是他的构建者。

public class AlertDialog extends Dialog implements DialogInterface {
private AlertController mAlert; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAlert.installContent();
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mAlert.onKeyDown(keyCode, event)) return true;
return super.onKeyDown(keyCode, event);
} @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (mAlert.onKeyUp(keyCode, event)) return true;
return super.onKeyUp(keyCode, event);
} public static class Builder {
private final AlertController.AlertParams P;
private int mTheme; /**
* Constructor using a context for this builder and the {@link AlertDialog} it creates.
*/
public Builder(Context context) {
this(context, resolveDialogTheme(context, 0));
} /**
* Set the title displayed in the {@link Dialog}.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setTitle(CharSequence title) {
P.mTitle = title;
return this;
} /**
* Set the message to display using the given resource id.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setMessage(int messageId) {
P.mMessage = P.mContext.getText(messageId);
return this;
} /**
* Set the message to display.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setMessage(CharSequence message) {
P.mMessage = message;
return this;
} /**
* Set the resource id of the {@link Drawable} to be used in the title.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setIcon(int iconId) {
P.mIconId = iconId;
return this;
} /**
* Set a listener to be invoked when the positive button of the dialog is pressed.
* @param textId The resource id of the text to display in the positive button
* @param listener The {@link DialogInterface.OnClickListener} to use.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setPositiveButton(int textId, final OnClickListener listener) {
P.mPositiveButtonText = P.mContext.getText(textId);
P.mPositiveButtonListener = listener;
return this;
} /**
* Set a listener to be invoked when the positive button of the dialog is pressed.
* @param text The text to display in the positive button
* @param listener The {@link DialogInterface.OnClickListener} to use.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setPositiveButton(CharSequence text, final OnClickListener listener) {
P.mPositiveButtonText = text;
P.mPositiveButtonListener = listener;
return this;
} /**
* Set a listener to be invoked when the negative button of the dialog is pressed.
* @param textId The resource id of the text to display in the negative button
* @param listener The {@link DialogInterface.OnClickListener} to use.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setNegativeButton(int textId, final OnClickListener listener) {
P.mNegativeButtonText = P.mContext.getText(textId);
P.mNegativeButtonListener = listener;
return this;
} /**
* Set a listener to be invoked when the negative button of the dialog is pressed.
* @param text The text to display in the negative button
* @param listener The {@link DialogInterface.OnClickListener} to use.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setNegativeButton(CharSequence text, final OnClickListener listener) {
P.mNegativeButtonText = text;
P.mNegativeButtonListener = listener;
return this;
} /**
* Set a listener to be invoked when the neutral button of the dialog is pressed.
* @param textId The resource id of the text to display in the neutral button
* @param listener The {@link DialogInterface.OnClickListener} to use.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setNeutralButton(int textId, final OnClickListener listener) {
P.mNeutralButtonText = P.mContext.getText(textId);
P.mNeutralButtonListener = listener;
return this;
}
/**
* Set a custom view to be the contents of the Dialog. If the supplied view is an instance
* of a {@link ListView} the light background will be used.
*
* @param view The view to use as the contents of the Dialog.
*
* @return This Builder object to allow for chaining of calls to set methods
*/
public Builder setView(View view) {
P.mView = view;
P.mViewSpacingSpecified = false;
return this;
} /**
* Creates a {@link AlertDialog} with the arguments supplied to this builder. It does not
* {@link Dialog#show()} the dialog. This allows the user to do any extra processing
* before displaying the dialog. Use {@link #show()} if you don't have any other processing
* to do and want this to be created and displayed.
*/
public AlertDialog create() {
final AlertDialog dialog = new AlertDialog(P.mContext, mTheme, false);
P.apply(dialog.mAlert);
dialog.setCancelable(P.mCancelable);
if (P.mCancelable) {
dialog.setCanceledOnTouchOutside(true);
}
dialog.setOnCancelListener(P.mOnCancelListener);
dialog.setOnDismissListener(P.mOnDismissListener);
if (P.mOnKeyListener != null) {
dialog.setOnKeyListener(P.mOnKeyListener);
}
return dialog;
} /**
* Creates a {@link AlertDialog} with the arguments supplied to this builder and
* {@link Dialog#show()}'s the dialog.
*/
public AlertDialog show() {
AlertDialog dialog = create();
dialog.show();
return dialog;
}
} }

也许它的开放性,AlterView也有自己的构建过程,这种使用AlterView建设者Builder要构建视图,他对象可以自行操作。

Android设计模式(十)--生成器模式的更多相关文章

  1. 设计模式十: 生成器模式(Builder Pattern)

    简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...

  2. 每天一个设计模式-7 生成器模式(Builder)

    每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...

  3. Android 设计模式之MVC模式

    说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...

  4. Java设计模式:生成器模式

    问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); ...

  5. 【设计模式】- 生成器模式(Builder)

    生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...

  6. Java设计模式-Builder生成器模式

    概念: 生成器模式也称之为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,构建与产品分离. UML: Ibuild接口清晰地反映了创建产品Product的流程. 生成器模式涉及4个关键 ...

  7. Android设计模式系列-组合模式

    Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式,Compos ...

  8. 面向对象设计模式_生成器模式详解(Builder Pattern)

    首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...

  9. 面向对象设计模式_生成器模式解读(Builder Pattern)

    首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...

  10. 设计模式--Builder生成器模式

    如果文章中哪里有问题,希望各位大哥大姐指出,小弟十分感激. 正文 什么是生成器模式? 生成器模式就是把生产对象的过程进一步抽取.细化.独立.以往我们生产对象,可能就是在一个小作坊里面从头做到尾.现在用 ...

随机推荐

  1. Java 兑换ObjectC代码

    现在非常多app发展,server我们使用Java发展,实时数据交换,与Android非常easy实现.是否xml依然是json,它可以很容易地转换成一个对象.这可以是硬IOS该程序猿.它们应根据数据 ...

  2. Android中callback(接口回调)机制

    事实上,callback 机制在Android 中无处不在,特别是以Handler.Callback.Listener这三个词结尾的,都是利用callback机制来实现的.比方点击事件onClickL ...

  3. Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程

    Win7+ubuntu kylin+CentOS 6.5三系统安装图文教程 引言:原本机子上已经装好了win7+Ubuntu Kylin 由win7引导,而不是Ubuntu的grub引导的双系统(安装 ...

  4. Audio Offload

    Audio Offload 音频分载,是系统将音频分载到声卡硬件进行分载处理的功能.从Windows 8开始,音频的硬件加速和分载处理又回来了.为什么说又回来了呢? 因为声卡自创通公司发明开始,相当长 ...

  5. 日版 Galaxy Note sc05d 涮机

    问题描写叙述:手机已坏.进不了系统 以下提供线涮刷机教程: 1.首先拔掉你的sd卡和sim卡.双清你的手机.可能有些版本号的机油没有双清模式,那就进到设置里边恢复出厂设置,然后关掉你的手机再开机.等到 ...

  6. 使用ReactiveCocoa实现iOS平台响应式编程

    使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前,先要介绍一下FRP(Functional Reactive Prog ...

  7. VMware GSX Server 3.2.1 Build 19281免费下载

    VMware GSX Server 3.2.1 Build 19281免费下载 评论2   字号:大中小 订阅 VMware官方下载: For Windows 版系统:http://download3 ...

  8. python学习笔记之11:图像用户界面

    这里会介绍如何创建python程序的图像用户界面(GUI),也就是那些带有按钮和文本框的窗口等.目前支持python的所谓“GUI工具包”的有很多,本文简要介绍最成熟的跨平台pythonGUI工具包- ...

  9. (step7.2.2)hdu 2161(Primes——判断是否是素数)

    题目大意:输入一个n,判断您是否是素数.. 解题思路:简单数论 代码如下: /* * 2161_1.cpp * * Created on: 2013年8月31日 * Author: Administr ...

  10. 让浏览器支持 jquery ajax load 前进、后退 功能

    BEGIN; 一般在做 ajax load 的时候,非常多人都不会考虑到须要浏览器支持前进后退功能,由于大部分人都不知道能够实现. 近期遇到这个问题,经过一小段研究,发现github已经有现成的开源工 ...