Android中的设计模式--建造者模式

Go 设计模式中建造者模式应用 这个例子中,我们通过建造者模式将创建一个复杂的游戏角色对象的过程分解成了多个步骤,并且将具体的实现细节隐藏在了 GameRoleBuilder 中。这样,我们就可以更加灵活地创建游戏角色对象,并且在需要添加新的属性或修改构建流程时,只需要修改 GameRoleBuilder 即可,不会影响到其他代码。建造者模式是一种创建型模式,用于将一个复杂对象的构建与其表示分离。在该模式中,一个单独的建造器对象负责创建与组装产品对象。下面介绍一个简单的例子,说明如何在 Go 中使用建造者模式来创建复杂对象。 阅读详情

转载请注明出处 http://blog.youkuaiyun.com/fofu33/article/details/50973172#comments
之前只知道建造者典型例子是AlertDialog,它的基本写法是

public class AlertDialog extends Dialog implements DialogInterface {
    private AlertController mAlert;

    protected AlertDialog(Context context) {
        this(context, resolveDialogTheme(context, 0), true);
    }

    @Override
    public void setTitle(CharSequence title) {
        super.setTitle(title);
        mAlert.setTitle(title);
    }

    public void setMessage(CharSequence message) {
        mAlert.setMessage(message);
    }

    public static class Builder {
        private final AlertController.AlertParams P;
        private int mTheme;

        public Builder(Context context, int theme) {
            P = new AlertController.AlertParams(new ContextThemeWrapper(
                    context, resolveDialogTheme(context, theme)));
            mTheme = theme;
        }

        public Builder setTitle(int titleId) {
            P.mTitle = P.mContext.getText(titleId);
            return this;
        }

        public Builder setMessage(CharSequence message) {
            P.mMessage = message;
            return this;
        }

        public Builder setOnCancelListener(OnCancelListener onCancelListener) {
            P.mOnCancelListener = onCancelListener;
            return this;
        }

        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);
            ...
            return dialog;
        }

        public AlertDialog show() {
            AlertDialog dialog = create();
            dialog.show();
            return dialog;
        }
    }
}

简单说就是把自个儿构造函数变成了保护类型,就不能主动创建了。那么创建需要一个使用它内部类Builder,给他传递AlertDialog标题、提示、点击监听等进行设置,然后每个函数都返回Builder好持续设置。设置完create构建AlertDialog并赋予对应设置项。

我纳闷为什么不直接new,非要搞个Builder创建,基本代码是需要写两遍。

昨两天写了一个实现TextWatcher 的MyTextWatcher,编辑框emoji表情限制,或者输入字数限制。但编辑框需求不同,有的是需要限制表情,有的只是需要限制字数回调剩余字数,那么构造函数就如下

public class MyTextWatcher implements TextWatcher {
    private EditText editText;
    private WatcherListener watcherListener;
    private int max_length;     //最大输入字数
    private boolean forbiddeEmoji;      //是否禁止输入表情

    //普通输入框watcher
    public MyTextWatcher(EditText editText){
        super();
        this.editText = editText;
    }

    //限制表情,但无需剩余字数监听回调
    public MyTextWatcher(EditText editText, int max_length){
        this(editText, max_length, null);
    }

    /**
     * 输入法监听工具类构造函数
     * @param editText      所需要监听的editText
     * @param max_length       editText限制输入长度
     * @param watcherListener  剩余字数监听回调
     */
    public MyTextWatcher(EditText editText, int max_length, WatcherListener watcherListener){
        this(editText, false, max_length, null);
    }

    /**
     * 输入法监听工具类构造函数
     * @param editText      所需要监听的editText
     * @param forbiddeEmoji     是否禁止输入表情
     * @param max_length       editText限制输入长度
     * @param watcherListener
     */
    public MyTextWatcher(EditText editText, boolean forbiddeEmoji, int max_length, WatcherListener watcherListener){
        super();
        this.forbiddeEmoji = forbiddeEmoji;
        this.editText = editText;
        this.max_length = max_length;
        this.watcherListener = watcherListener;
    }
    。。。
}

虽然最后一个构造函数已经可以包含前面的构造函数,但调用不免不想传过多的无用参数,所以还是写了前面的参数少的构造函数。

如果参数更多,需要控制的可能性更多的情况时,你会发现需要写很多的构造函数去包含这些传参情况,此时你会发现Builder就能很好的解决这个问题。把所有的需求一次性提完,然后再构建。于是便有了下面的代码

public class MyTextWatcher implements TextWatcher {
    protected EditText editText;
    protected int max_length = -1;      //最大输入字数
    protected boolean forbiddeEmoji;        //是否禁止输入表情
    protected WatcherListener watcherListener;

    protected MyTextWatcher(){
        super();
    }
    ...
    public interface WatcherListener{
        void editTextRemainNum(int num);
    }

    public static class Builder{
        private MyTextWatcher watcher;

        public Builder(EditText edit){
            watcher = new MyTextWatcher();
            watcher.editText = edit;
        }

        public Builder setMax_length(int max_length) {
            watcher.max_length = max_length;
            return this;
        }

        public Builder setForbiddeEmoji(boolean forbiddeEmoji) {
            watcher.forbiddeEmoji = forbiddeEmoji;
            return this;
        }

        public Builder setWatcherListener(WatcherListener Listener){
            watcher.watcherListener = Listener;
            return this;
        }

        public MyTextWatcher create(){
            return watcher;
        }
    }
}

MyTextWatcher是proctected所以外部无法直接创建,Builder构造函数写上了MyTextWatcher必须的设置的editText。虽然Builder早有MyTextWatcher成员,但一直藏着噎着只有create()的时候才吐出来。当然MyTextWatcher类中对watcherListener的回调前需要判空。

tvbrief.addTextChangedListener(new MyTextWatcher.Builder(tvbrief).setForbiddeEmoji(true).setMax_length(MAX_LENGTH).create())

使用时我们这样便可以了。当然单独此例还是构造函数传参来的快。

Android面试题_安卓面经(23/30)设计模式源码案例 无论是做哪种编程语言的开发工作,过了新手期后,都需要了解设计模式,在安卓开发中也一样,本人曾在面试中让我列举安卓源码中设计模式的案例。 阅读详情

相关推荐

【ECCV 2024】动态范围直方图自注意力DHSA,即插即用!

直方图自注意力机制,将空间特征按强度分段并进行分组,然后在各个分组内或分组间应用自注意力,以选择性地关注具有动态范围的空间特征,并处理长距离内相似退化的像素。

qq_43303160的博客 1844

android开发中使用到的一些设计者模式

单例模式 概念:确保一个类只有一个实例,并且自行实例化并向整个系统提供整个实例。public class Singleton { private static volatile Singleton instance = null; private Singleton(){ } public static Singleton getInstance()

xiangzhihong8的专栏 5093

局部,全局(外部),static等变量详解

首先,必须明白一个程序是包含若干个源文件,每个源文件又是包含若干个函数,每个源文件、函数中又定义了若干个变量。但是每个变量都有自己的作用范围,也就是自己的作用域。只有在作用域内才可以访问变量。 变量的有效范围称为变量的作用域( scope)。归纳起来,变量有4种不同的作用域:文件作用域( file scope)、函数作用域( function scope)、块作用域(block sc...

归根结底不优秀的博客 1322

【Kotlin设计模式】建造者模式在Android中的应用

在Android中,建造者模式被广泛应用于需要配置多个选项、步骤复杂或构建过程不容易一步完成的场景。通过建造者模式,可以更轻松地创建和配置复杂对象。

Ho博客 963

Python+Seaborn可视化:双因素方差分析结果这样呈现更专业

本文详细介绍了如何利用Python中的Seaborn和statsmodels库,专业地执行并可视化双因素方差分析结果。通过模拟实验数据,演示了从模型构建、统计检验(包括交互作用分析)到诊断验证的全流程。重点展示了如何使用Seaborn绘制交互效应图、组合分布图及热图,将复杂的统计结果转化为直观、富有洞察力的可视化图表,助力科研论文与商业报告的专业呈现。

weixin_29274969的博客 137

il2cpp分析-gobal-metadata.dat解密

打开ida,把libil2cpp拖到ida中按快捷键Shift+F12等待字符串分析完后,搜索global-metadata.dat。ida中双击sub_57EE7C进入,VS code中也跳转到LoadMetadataFile函数。VSCode打开il2cpp源代码,全局搜索global-metadata.dat。工具:010Editor,IDA 7.5,Jadx,VS Code。判断加密逻辑为根据文件的长度循环读取字节码做亦或加密。双击搜索出来的结果,切记要选il2cpp目录下的。

Android_machong的博客 8024

Android小知识-理解设计模式中的建造者模式

本平台的文章更新会有延迟,大家可以关注微信公众号-顾林海,包括年底前会更新kotlin由浅入深系列教程,目前计划在微信公众号进行首发,如果大家想获取最新教程,请关注微信公众 建造者模式的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。也就是说将构建过程和部件的表示隔离开,用户可以在不知道内部构建细节的情况下,对对象的构造流程进行相应的控制,比如在Android...

weixin_33696106的博客 123

航天设备研制中的形态分类:电性件、正样件及其他关键形态详解

航天设备的研制是一个高度复杂且严谨的工程过程,涉及多个阶段的不同产品形态。这些形态各具特点,在研制流程中承担着不同的验证任务和工程目标。本文将系统介绍航天设备研制中的主要形态,包括**电性件(EM)**、**正样件(FM)**以及**结构热控件(STM)**、**鉴定件(QM)**和**初样件(PFM)**等,详细解析它们的定义、用途和工程意义,帮助读者全面理解航天产品从设计到飞行的全生命周期管理。

ScilogyHunter的博客 1654

android 设计者模式,Android小知识-理解设计模式中的建造者模式

本平台的文章更新会有延迟,大家可以关注微信公众号-顾林海,包括年底前会更新kotlin由浅入深系列教程,目前计划在微信公众号进行首发,如果大家想获取最新教程,请关注微信公众号,谢谢建造者模式的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。也就是说将构建过程和部件的表示隔离开,用户可以在不知道内部构建细节的情况下,对对象的构造流程进行相应的控制,比如在Androi...

weixin_34928063的博客 192

点云配准3:3d-ndt算法在pcl上的实现以及参数设置

3d-ndt算法在pcl上的使用方法以及参数设置

诺有缸的高飞鸟的博客 7891

机器人轨迹规划——梯形速度轨迹(超详细)

机器人轨迹 这一系列轨迹教程将主要包括以下内容: 点到点轨迹(P2P) 五次多项式插值轨迹 三次多项式插值轨迹 梯形速度曲线轨迹 双S形速度曲线轨迹 多个自由度轨迹的时间同步 在线轨迹规划 多项式在线轨迹规划 梯形在线轨迹规划 双S形在线轨迹规划 非线性实时轨迹滤波 多点轨迹(Multi-point) 三次样条曲线(cubic spline) 贝赛尔曲线(Bezier Curve) B样条曲线(BSpline) 时间最优轨迹 三次样条时间最优轨迹 任意路径下的时间最优轨迹 时间

出门搔白首,若负平生志 1万+

设计模式—建造者模式及实例(BuilderPattern)

建造者模式(Builder Pattern)也称生成器模式,它属于创建型模式。

小嵩的博客 4002

手把手教你学Simulink--逆变器场景:基于Simulink的单相全桥逆变器PWM控制仿真建模

本文介绍了使用Simulink和Simscape Electrical库进行单相全桥逆变器PWM控制仿真建模的详细步骤。主要内容包括:从创建Simulink项目、添加电力电子组件、构建逆变器模型,到设置参数、运行仿真和结果分析。重点讲解了逆变器核心模块的配置、PWM信号生成、负载建模等关键环节,并提供了优化改进建议。该指南适用于电力电子初学者,通过仿真可以帮助理解单相全桥逆变器的工作原理和PWM控制技术,为实际应用和算法开发提供基础平台。

MHD0815的博客 665

Android设计模式详解之建造者模式

Builder模式是一种创建型设计模式。将一个复杂对象的创建与它的表示分离,使得同样的构造过程可以创建不同的表示。相同的方法,不同的执行顺序,产生不同的事件结果时;多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;初始化一个对象特别复杂,如参数较多,且很多参数都具有默认值时;UML类图:产品类;抽象Builder类,规范产品的组建,一般由子类实现具体的组建过程;具体的Builder类;统一组装过程;良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节;

故不积跬步无以至千里 1271

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java设计模式-建造者模式

1:使用场景 1)相同的方法,不同的执行顺序,产生不同的事件结果 2)多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不同 3)产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用 4)当初始化一个对象特别复杂,如参数多。 2:UML图 3:代码举例

aoaoxiexie的专栏 405

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android中应用到的设计模式

其实一般程序员写业务代码,用不了多少设计模式。写出易于理解、维护的代码,相对更重要。 一、引言 那设计模式是什么? 很多人,包括我,都曾迷陷于 23 种设计模式之中,初识设计模式,赞叹于其精妙,就像个萌新的江湖小生,偶然间掉到个山洞,一下就集齐了威震江湖的“7种武器”。然后……就开始了用长生剑切菜,用碧玉刀削瓜的“幸福生活”,不但把...

157

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android定义客户类,Android设计模式(一)—— 建造者模式

其实设计模式,只是一种定式,适用于不同的语音,今天,虽然加上了Andorid的前缀,只是因为举例仅是android代码,所以学好内在,则举例仅是举例,内涵才是到处通用的。建造者模式解释:建造者模式(Builder Pattern)又叫生成器模式,是GoF提出的23种设计模式中的一种。建造者模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的...

weixin_35985796的博客 161

PHP设计模式之建造者模式

建造者模式,也可以叫做生成器模式,builder这个词的原意就包含了建筑者、开发者、创建者的含义。很明显,这个模式又是一个创建型的模式,用来创建对象。那么它的特点是什么呢?从建筑上来说,盖房子不是一下子就马上能把一个房子盖好的,而是通过一砖一瓦搭建出来的。一个房子不仅有砖瓦,还有各种管道,各种电线等等,由它们各个不部分共同组成了一栋房子。可以说,建造者模式就是这样非常形象的由各种部件来组成一个对象...

bujidexinq的专栏 205

Android-PickerView 设计模式学习资源:推荐的设计模式学习材料

### 1.1 模式定义与应用场景 建造者模式(Builder Pattern)是一种创建型设计模式,用于构建复杂对象。它将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。在Android开发中,常用于**配置复杂视图**(如对话框、自定义控件)或**参数化对象创建**场景。 ### 1.2 Android-PickerView中的建造者模式实现 #### 1.2.1 核心角色...

gitblog_00495的博客 909

每个 Android 开发者都必须知道的 5 种设计模式

由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的扫码免费获取。还有免费的高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。...

Android_XG的博客 984

android 设计者模式,Android 设计模式--建造者模式

Android 设计模式--建造者模式Android 设计模式简述建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(Concrete Builder)角色。具体建造者类必...

weixin_39938312的博客 178

设计模式思维导图总结:一、建造者模式

qq_30208785的博客 173

盘点android中常见的设计模式(二) -- Builder模式/建造者模式

简介: 建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个Builder类会一步一步构造最终的对象,该Builder类是独立于其他对象的。 ...

ledding的博客 1277

Android第六次面试总结之Java设计模式篇(一)

Java设计模式之单例,工厂模式,建造者模式的知识讲解

2301_80329517的博客 1097

android常用设计模型,Android开发过程中常用设计模式

android开发过程中,掌握常用的设计模式无疑会使我们的开发效率大大的提高,最近面试的时候也常常被问到开发过程中都用到那些设计模式,于是决定收集些安卓开发常用的设计模式作为储备知识。一:单例模式(Singleton Pattern)概念:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这样做有以下几个优点:对于那些比较耗内存的类,只实例化一次可以大大提高性能,尤其是在移动开发中...

weixin_35108433的博客 337
上一篇: Android开发过程中遇到的问题(长期补充)
下一篇: Android 6.0指纹识别App开发Demo
Leafact
博客等级 码龄14年 20粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值