最近在读Head first 设计模式一书,发现归根到底指的是对于面向对象语言中多态、继承、封装的相互组合以此来降低代码耦合性,使自己的代码便于扩展及修改。
关于书中对于提到的设计模式的总结:
1、策略模式:针对接口编程,将不确定的行为(方法)重新定义为行为(方法)集合,在集合中方法可以彼此替换,行为(方法)集合同时实现同一接口,客户端将针对接口来开发,具体实现可以由客户端决定使用何种具体方法。原则:针对接口开发、善用组合。
适用场景:同一类型的类,具体相同的方法,但是有些类的实现方法不同。
2、观察者模式:一对多的情况出现,与Android机制里面广播类似,当自己发生改变时需要告诉自己身边与些事相关的所有人。
适用场景:一个改变之后需要通知多个。
3、装饰者模式:动态的使用继承实现,在基类的基础上进行扩展,符合开放-封闭原则。类似于java I/O就的读写数据流。
适应场景:开放-封闭原则,即在不改变基础的情况下进行新功能的扩展。
4、工厂模式、抽象工厂模式:前者是创建一个对象由子类来实现具体的类,后者是创建一系列的对象不需要指明具体的使用。使用时,前都是直接创建子类对象来具体的实现,后者是创建实例化对象并将它传入对象的方法中来实现。
适用场景:前者是创造单独的产品,后者是创建一个产品的集合。两者的使用范围不相同
5、单例模式:保证对象惟一性,在使用时注意多线程同步问题,为了确保多线程中的同步情况使用单例模式有三种情况可以参考,1,在创建对象时添回synchoronized 标志符,2,直接声明单例对象,3,使用volatie 确保对象的单一并使用synchoronized来确保返回对象的惟一
public class Singleton { private volatile static Singleton singleton = new Singleton(); public static Singleton getInstance() { if(singleton == null) { synchronized (Singleton.class) { singleton = new Singleton(); } } return singleton; } }
适合场景:整个应用中确保数据的惟一性,例如:数据库连接、环境变量保存等等。
6、命令模式:通过命令的方式将上层与底层的具体实现分拆开来,保证上层与底层的互不影响。命令可以使用队列方式来保存未执行的命令。
适应场景:上层与底层可以通过数据来区分开,两者的逻辑不会相互影响。
7、适配器模式:将接口转换成客户需要的接口定义,即在一方已经固定的情况下,如果有新的对象加入,但是与之前的方法不同,这时就需要使用适配器将方法进行转换
适应场景:在不改变上层或者下层调用的时候添加对于接口定义的转换。
8、外观模式:子系统向上提供统一的接口来供上层调用。这些统一的接口实现可能是由子系统中很多接口共同实现的。但是对于外在来说只有一套统一的接口。
适用场景:上层与底层分开。
9、模版模式:对于算法及其它过程的封装,将过程封装完成,具体的过程步骤由子类实现,在模版模式中可以得用勾子来对于算法过程的干涉。
适用场景:算法或者过程步骤明确
10、状态模式:根据自行的状态来改变自己的行为,将状态与步骤的关系放在一个类中,同时将步骤拆分成不同的类。添加对于程序的扩展性。与策略模式的不同在于,策略模式是由应用来判断是采取哪个方法判断的。
适用场景:完整的算法或者是过程来封装完闭,由算法内部不同的状态来判断步骤并生成结果
11、代理模式:为另一个对象提供一个替身或者占位符。远程代理,Java中的远程服务可以用RMI来注册并在客户端使用Naming来获取远程代理的应用。流程client ->Proxy->Sub->服务端实现。