1.builder模式
优点
实现了产品构建和产品表现的分离。
这句话的意思是客户端构建产品的时候只会调用builder的设置方法,最后构建出一个产品。并没有直接调用产品类的设置属性方法,或者直接为产品的属性赋值。
我们在调用的时候并不需要关心产品类的具体属性和方法,可以比较容易的改变产品类的内部表示。
另外的一个好处是,builder提供了产品类比较好的一致性。因为如果直接构造产品
类的话,我们可以在任何时候,任何线程对产品类做set操作,这就导致了一些bug很难找到。
2.adpter模式
类适配器
类的适配器模式把适配的类的api转换成为目标类的API。
利用继承的方式重新定义Adptee的部分行为,达到适配的目的。
因为是继承关系,所以对于变化,可以通过新增一个继承,改变类适配器的行为。
对象适配器
与类的适配器模式一样,对象的适配器模式把适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象适配器不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adptee类。
对于对象适配器,一个适配器可以把不同的源适配到同一个目标。
对于对象适配器使用对象组合的方式,是动态组合的方式。
对于对象适配器,要重新定义Adptee的行为比较困难。因为不像类适配器,增加一个继承类就可以了。
listview的缓存
3.装饰器模式
概念
动态地给一个兑现更加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。
比继承的优点
不会产生很多的子类。对客户端透明,减少耦合度。
使用场景:
1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
2.当不能采用继承方式对系统进行扩展或者采用继承不利于系统扩展和维护
时,可以使用装饰模式。比如有些Final类。
4.外观模式
定义
外观模式的主要目的在于让外部减少与子系统内部多个模块的交互,从而让外部能够更简单的使用子系统。它负责把客户端的请求转发给子系统内部的各个模块进行处理。
使用场景
1.当你要为一个复杂子系统提供一个简单接口时。
2.客户程序与抽象类的实现部分之间存在着很大的依赖性。
3.当你需要构建一个层次结构的子系统时候
5.组合模式
定义
将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户以一致的方式处理单个对象以及对象的组合。
优点
1.高层模块调用简单
2.节点自由增加
实例说明
该例子生动的说明了组合方式的好处
https://www.cnblogs.com/lfxiao/p/6816026.html
https://www.cnblogs.com/snaildev/p/7647190.html
android中的应用
android中的view采用了组合模式
6.策略模式
概念
定义一系列的算法,把它们一个个封装起来,并且使他们可相互替换,本模式使得算法可独立于使用它的客户而变化。用来替代if else和switch方式
使用场景
一个类定义了多种行为,并且这些行为在这个类的方法中以多个条件语句的形式出现,那么可以使用策略模式来避免类中使用大量的条件语句。
优点
1.上下文(Context)和具体策略(ConcreteStragety)是松耦合关系。因为上下文
持有的是抽象的策略类。
2.满足开闭原则。
andorid中的应用
1.Volley中对于httpstack使用策略模式
7.模板方法模式
定义
模板方法是通过定义一个算法框架,而将算法中的步骤延迟到子类,子类就可以特定的算法。
使用场景
1.多个子类有公有方法,并且逻辑及基本相同
2.重构时经常使用,将相同的代码抽取到父类中。
在android应用
AysncTask,Activity
8.观察者设计模式
概念
定义对象之间一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
andorid中的应用
1.回调模式
2.listview中的notifyChanged
9.责任链设计模式
概念
是一个请求有多个对象来处理,这些对象是一条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下一个对象,直到有对象处理它为止。
使用场景
1.有多个对象可以处理同一个请求,具体哪个对象处理该请请求待运行时刻再确
定。
2.在不明确指定接受者的情况下,向多个对象中的一个提交一个请求。
3.可动态指定一组对象处理请求,客户端可以动态创建职责链来处理请求。
在android中的应用
1.try catch
2.ordered broadcast
3.viewgroup事件传递
易混淆的设计模式
适配器模式和装饰器模式
装饰器与适配器都有一个别名叫做 包装模式(Wrapper),它们看似都是起到包装一个类或对象的作用,但是使用它们的设计目的很不一一样。
适配器模式的意义是要将一个接口转变成另一个接口,它的目的是通过改变接口来达到重复使用的目的。 所以从UML中看出,adpter类必须继承一个已有的接口,从而保证符合目标类的接口,而不必关心被适配类adptee的接口如何
而装饰器模式不是要改变被装饰对象的接口,而是恰恰要保持原有的接口,但是增强原有对象的功能,或者改变原有对象的处理方式而提升性能。所以从UML图可以看出,装饰者和被装饰者都必须继承于同一个父类,从而保证接口的相同。