Android源码设计模式解析与实践总结
年前开始看Android源码设计模式解析与实战,看看停停看看,一直断断续续,年后回来又一段时间了。现在想起来把这本书还是要仔细看看,熟悉常见的设计模式。以后的工作中尝试使用和读源码能更好的理解源码。
一、单例模式
单例模式是最常见的模式,也是每个编程开发人员都知道的一种模式。其主要思想就是保证全局对象唯一。具体来讲就是将类的构造函数私有化,类内部定义自己本身的一静态对象,同时提供一个共有的静态实例返回方法。如果自身实例对象已存在,即返回,不存在,创建后再返回。稍微深一点理解和使用,平时大家常说的单例模式的具体实现有两种方式:懒汉式和饿汉式,其区别就是一个直接创建,一个是判断为空时再创建;作为规范编程和提高效率来讲,肯定是懒汉式。另外,还有一个问题,单例模式会涉及到多线程并发的线程安全问题;解决方案就是要采用加锁代码块的方式来实现线程安全。
二、Builder模式
Builder模式我自己翻译成构建者模式,大家理解最深刻的应该就是Android中创建Dialog时采用的是Builder模式。Builder作为功能类内部的一个静态内部类,一般来说会包含若干setXXX()方法,比如dialog中builder中会支持setTitle(),setMessage()等方法,同时还有一点也很特别,一般这些若干setXXX()方法的返回值类型都是Builder类型,也就是说支持若干set方法连续调用,最后我们要显示的调用Builder类的build()方法,该方法中一般就会检查上述调用的一个参数是否合法,给出提示,最后再执行其他功能方法。我的理解,Builder静态内部类,还有调用的build()方法就相当于初始化,但是使用功能类时需要某些特别的参数,比如一定要有title,message等,所以,初始化之前,需要我们进行显示的设置,否则不能正常使用;我自己的理解是可以通过Builder这种模式来告诉我们的开发人员需要传哪些必传参数,然后实例话;要不然如果没有明显的标志来提醒我们,我们在使用api时就会有很多的坑需要填,浪费我们的开发时间。
三、工厂模式
在学校上学期间学习java时就听老师大讲特讲java的设计模式。还依稀记得号称有23种设计模式。其中工厂模式就是最早了解到的一种。所谓工厂设计模式其实很好理解,就是说可以定义一个工厂类,该类用来负责生成具体的实现类。由于我们程序实现为了解耦,大都会以接口和实现的方式来进行。所以一个接口可能有好几种不同的具体实现。说起来比较抽象,我还是举我最初学习和实践的一个列子来说明下。在项目中我们都会用到数据库来实现数据的存储和读写。所以我们要编写数据库操作类。为了提高程序的灵活性和降低程序的耦合度,我们首先定义一个数据库操作类接口,有读和写两个方法。在一个项目中,我们刚学了SQLServer数据库,所以我们定义个SQLServerManager类来实现读和写方法;在另一个项目中,我又刚学会MySQL,为了练习,所以我用MySqlManager来实现读和写方法。依次类推...可能还有其他的具体操作实现。这样就产生了一个问题,到底使用哪个实现类来操作数据库的问题。如果我们不采用工厂模式,我们就用到一处就写一处,等到后面如果领导说,要换另外一种,我们就蒙蔽了。为了实现我们最小的代码修改,我们定义一个工厂实现类,用来返回一个具体的数据库操作实例。这样就可以做到随意替换。
四、模板模式
模板模式又叫装饰模式。所谓装饰模式或者模板模式,通俗易懂,就是在原有的一个模板的基础上,我们封装出新的API来提供新的功能。属于锦上添花的封装。我了解这个模式最早的时候是在学校的时候看着视频重新学java的时候,看的黑马培训的毕向东的全套视频。印象最深的就是java中的I/O操作,各种封装,比如输入流InputStream,在其基础上的有BufferedInputStream,这样我们就能看到从名字就能看出来后面的是基于前面的类而来的。另外说一点,I/O流操作那块所有的类基本都是对成的,input和output是对着来的,当然也不是全部。这样说只是为了方便我们复习和记忆掌握API。
五、观察者模式
在看这本书之前或者说在写这篇博客之前,我仅仅知道有观察者模式这么一说,和别人说起来的时候也是都说观察者模式。但是,还真没有实际的看过其具体的定义和原理。观察者模式中定义对象间一种一对多的依赖关系,使得每当一个对象状态改变,则所有以来于它的对象都会得到通知并被自动更新,如上是观察者模式的定义。其次,从上面的定义我们不难理解出,关系是一对多的关系,一方状态改变,多方会得到通知并更新。所以我们自然的理解到观察者模式中存在的两种角色:观察者角色和被观察者角色。被观察者称为Observable,观察者称为Observer。具体到Android系统中,书中举的例子是ListView的Adapter实现和更新。Adapter在更新时调用也涉及到了观察者模式。原来我一直以为Adapter是适配器模式。另外,源码分析这本书中还讲了我们使用的广播注册和广播发送也是用到了观察者模式。这块自己理解的还不是很深,后续会写Demo。
六、代理模式
代理模式说白了就是让别人替自己干活。体现在程序上就是在功能类的基础上,再封装一个代理类,代理类中包含了功能类对象,然后代理类中提供访问功能类各种方法的方法。在具体的实现和使用时,构造一个功能类对象,然后封装到代理类中,采用代理类对象访问需要的方法。在源码设计一书中还提到了静态代理和动态代理两种代理分类。上面说的最简单的就是静态代理,所有的代码和功能都需要实现,然后调用访问。第二种动态代理是在程序运行的时候我们才能决定到底需要代理谁去执行方法功能,其中用到的核心就是反射思想,在程序运行时,根据传递的不同的类,利用类加载器ClassLoader将传递的类对象加载到内存,然后根据传递的参数访问其具体的方法,实现动态的代理各种各样的类对象。
后记:
之前一直浑浑噩噩的忙完公司项目就完了。至多到github上看看别人好的项目。从年前开始自己也想开始积累,写点东西,也慢慢养成看书的习惯了。希望能坚持下去。
扫描下方的二维码,加入关注,所发布的博客文章会及时发布到公众号,方便及时查看,加入我吧,一起进步。
喜欢而非坚持