在大二下的学期中,我学习了软工专业必修课之一的设计模式,教材是《设计模式》(GOF,语言为C++)。这本书一共介绍了23种设计模式,但因为是考试只考重要的几种设计模式的原因(也应该包括自己C++不够熟练,GOF的书C++代码太抽象导致很难理解),所以现在只对其中一些模式熟悉,如策略、观察者,目前准备买一本《Head First设计模式》暑假仔细看一看。
目前,我正在一个团队里边进行android开发工作。在写代码的同时,突然想到是否可以应用不同的设计模式来达到优化结构、提升效率的效果,于是在根据自己的记忆和网上的知识,将android实用的设计模式记录下来。
- Builder模式:比如AlertDialog.Builder; 创建一个AlertDiaolog就用到了Builder模式,如
new AlertDialog.Builder(context).setTitle("you are invited!").setIcon( android.R.drawable.ic_dialog_info).setMessage("are you sure?").setPositiveButton("yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Binding(); } }) .setNegativeButton("no", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).show(); }
简单模拟Android中AlertDialog的Builder设计模式
- 适配器模式:比如GridView、ListView与Adapter;
最常用的,我们在使用ListView的时候,一般会创建当前的一个类,包含当前ListView的成员,然后添加相应的适配器的类,这里就用到了适配器模式
例Android设计模式系列(9)--SDK源码之适配器模式
- 命 令模式:比如Handler.post;意图:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作
动机:将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。 常常在新线程中使用。
命令模式下的异步消息处理(Handler,Message,Looper,Thread)
- 享 元模式:比如Message.obtain;
在JAVA语言中,String类型就是使用了享元模式。String对象是final类型,对象一旦创建就不可改变。在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝。
例Android和设计模式:享元模式
- 单 例模式:比如InputMethodManager.getInstance
单例模式,顾名思义,就是确保应用只有一个实例
例Android源码学习之单例模式应用
- 观察者模式:比如ContentObserver;
观察者模式:记得老师在讲这个模式的时候,用了一个生动的例子:有一家报纸媒体,有许多人订阅这个报纸,然后这家报纸媒体一有新内容就对已订阅的人逐一发送邮件,进行通知。
将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。
例Android中内容观察者的使用---- ContentObserver类详解 - 抽象工厂模式:比如BaseActivity,
相信许多人和我一样,不能分别抽象工厂模式和工厂模式的区别。最近,我在知乎上看见了了一个答案可以帮助理解:
工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
具体的android开发例子 可以看看链接中的例子
例Android Ap 开发 设计模式第八篇:抽象工厂模式