Android--Builder模式
2017-06-27 18:36
134 查看
这次来说说Builder模式。
在Android中,我们需要在UI上面弹出一个dialog,经常会写如何代码:
这里就是我们常见的Builder模式了。
本来是想show一个dialog的,为什么是new一个AlertDialog.Builder呢?而不是直接new AlertDialog呢,当然也不是不可以,不过我们这种方法隐藏了dialog的内部实现,我们不需要去关心里面的实现,而且这种链式代码会显得代码逻辑结构特别清晰。
点进去源码里面我们发现,Builder其实就是AlertDialog的一个内部类。
我们来看看create()里面做了什么:
public AlertDialog create() { // Context has already been wrapped with the appropriate theme. final AlertDialog dialog = new AlertDialog(P.mContext, 0, 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;}
这是Android里面比较典型的一个Builder模式的例子,那么Builder模式究竟是一种什么模式呢?
介绍:builder模式主要是为了将对象的内部构建和部件进行解耦,使得构建和部件的表示隔离开,比如需要组装一个机器人,而这个过程很复杂,而很琐碎,对于使用者来说,他并不关心这个过程,也不需要知道具体的过程,他只需要告诉组装机器的人员他的需求即可,比如颜色、高度等属性。使用Builder模式可以将这两个过程分离,两者之间的耦合度降到最低。
常用场景:当我们编写的某些bean类参数非常多时,一般我们会选择构造函数传参或者set()方法,但是参数太多会导致代码难以维护和臃肿,Builder模式就能够让代码看起来更加简洁。
以下一个非常简单的例子,仅做介绍:
那么这样实现之后,调用就会变得非常简单:
在Android中,我们需要在UI上面弹出一个dialog,经常会写如何代码:
private void showdialog(){ new AlertDialog.Builder(SecondAcy.this) .setMessage("This is a dialog") .setPositiveButton("Ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //do what you want to do } }) .create().show(); }
这里就是我们常见的Builder模式了。
本来是想show一个dialog的,为什么是new一个AlertDialog.Builder呢?而不是直接new AlertDialog呢,当然也不是不可以,不过我们这种方法隐藏了dialog的内部实现,我们不需要去关心里面的实现,而且这种链式代码会显得代码逻辑结构特别清晰。
点进去源码里面我们发现,Builder其实就是AlertDialog的一个内部类。
我们来看看create()里面做了什么:
//通过setMessage传进去的参数最终赋给了AlerDialog.其余属性也类似
public Builder setMessage(CharSequence message) { P.mMessage = message; return this; }
//可以看到,create()里面其实就是new AlertDialog()的过程,而dialog的属性也是由调用者通过builder 来传进来
public AlertDialog create() { // Context has already been wrapped with the appropriate theme. final AlertDialog dialog = new AlertDialog(P.mContext, 0, 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;}
这是Android里面比较典型的一个Builder模式的例子,那么Builder模式究竟是一种什么模式呢?
介绍:builder模式主要是为了将对象的内部构建和部件进行解耦,使得构建和部件的表示隔离开,比如需要组装一个机器人,而这个过程很复杂,而很琐碎,对于使用者来说,他并不关心这个过程,也不需要知道具体的过程,他只需要告诉组装机器的人员他的需求即可,比如颜色、高度等属性。使用Builder模式可以将这两个过程分离,两者之间的耦合度降到最低。
常用场景:当我们编写的某些bean类参数非常多时,一般我们会选择构造函数传参或者set()方法,但是参数太多会导致代码难以维护和臃肿,Builder模式就能够让代码看起来更加简洁。
以下一个非常简单的例子,仅做介绍:
package com.example; //属性繁多,内部实现复杂的bean类,(这里的属性没有设置太多,省略里面一些计算过程,实际项目中 应该比较多类似的情况) public class BuilderModel { private String name; private int age; private String province; private int height; private int weight; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } /**将一些比较复杂的计算过程和属性的表示解耦,对调用者隐藏实现细节*/ private void caculateHelth(){ //do some complex caculation } /**Builder可以做成BuilderModel的内部类*/ public static class Builder{ public BuilderModel model=new BuilderModel(); public Builder(){ } public Builder buildWeight(int w) { model.setWeight(w); return this; } public Builder buildName(String name) { model.setName(name); return this; } public Builder buildAge(int age) { model.setAge(age); return this; } public Builder buildProvince(String province) { model.setProvince(province); return this; } public BuilderModel create(){ return model; } } }
那么这样实现之后,调用就会变得非常简单:
new BuilderModel.Builder().buildName("de").buildWeight(92).buildAge(20).buildProvince("GD").create();
相关文章推荐
- Android开源项目-Jamendo音乐播放器研究与优化-基于Builder模式的数据库操作
- 简单模拟Android中AlertDialog的Builder设计模式
- Builder模式在Android自定义底部对话框的实现
- Android设计模式之建造者模式(builder pattern)
- 读Android Builder设计模式后实战
- Android设计模式之Builder
- Android中Builder设计模式
- Android设计模式源码解析之Builder模式
- Android设计模式源码解析之Builder模式
- 简单三步通过Builder模式来实现Android顶部导航TopBar
- 【AndroidUniversalImageLoader】源码学习之设计模式(Builder,Singleton,Strategy)
- AndroidStudioTip--用Builder模式替代构造方法
- Android 建造者(Builder)模式
- Android设计模式——Builder模式
- android 设计模式——Builder
- Android:Dialog对话框、Builder、showDialog、模板方法设计模式
- Android开发之Buidler模式初探结合AlertDialog.Builder讲解
- Android开发中无处不在的设计模式——Builder模式
- Android Builder模式分析(链式调用)
- Android 建造者(Builder)模式