开发人员对于设计模式,就像剑客对于剑,不管剑在手中还是在心里,总的有一把。此书对于掌握常见的设计模式,确有很大的帮助,Head First系列的书,总是不会让我们失望的。
OOD的五条基本原则,简称为:SOLID的5原则,下拉讲述的设计模式都是基于此五条原则的通用解决方法或模板。
S = 单一职责原则 Single Responsibility Principle (一个类应该只有一个单一职责或功能,如果你的类有多于一个原因会导致它变化(或者多于一个职责),你需要依据它们的职责把这个类拆分为多个类)
O = 开放闭合原则 Opened Closed Principle (软件实体(类,模块,函数等等)应当对扩展开放,对修改闭合,这要求抽象方法的时候要恰当)
L = Liscov替换原则 Liscov Substitution Principle(子类型必须能够替换它们基类型,这就要求抽象的基类型必须适当,保证子类都能恰当的继承)
I = 接口隔离原则 Interface Segregation Principle(客户端不应该被迫依赖于它们不用的接口,要求每个接口或抽象类型定义的职责明确单一,以方便扩展及继承)
D = 依赖倒置原则 Dependency Inversion Principle(高层模块不应该依赖底层模块,两者都应该依赖其抽象,这也是针对接口编程的核心)
除SOLID原则外还有很多其它的面向对象原则。如:
"组合替代继承":这是说相对于继承,要更倾向于使用组合;
"笛米特法则":这是说"你的类对其它类知道的越少越好";
"共同封闭原则":这是说"相关类应该打包在一起";
"稳定抽象原则":这是说"类越稳定,越应该由抽象类组成";
设计模式只是对一些经常出现的场景的一些通用设计建议。这些灵感主要来自于面向对象原则。你可以把设计模式看作"框架",把OOD原则看作"规范".
1.singleton单例模式:只能有一个实例,通过将构造函数private,并提供静态的getInstance方法,需要注意的是此方法需要考虑多线程下的实例问题,可以考虑使用双重检查及加锁机制,保障多线程下的单一性。
2.工厂与抽象工厂模式:根据针对接口编程原则,这两个模式都是返回接口类型的具体实例,只不过对于工厂而言,在方法中具体做判断来生成某个具体实例,而所谓的抽象工厂,无非是抽象工厂类有多个方法可以返回不同接口的不同对象。
3.Builder模式:对于参数多且参数在构建过程中灵活多变的对象创建,可以先创建一个内部静态Builder辅助类,将这些参数由构造器参数转变为普通javabean参数,Builder类中的build方法将设置的参数(如果未设置取默认参数则使用Builder中默认的参数)一一对应到要创建的对象属性,然后返回该对象,实现创建过程。
4.Prototype原型模式及FlyWeight享元模式:如果某种类型的对象Cloneable,可以考虑利用可克隆性提高构建对象的效率。而对于享元模式,就是"池"而已。这两种模式可以提高大对象的构建效率。
ps:创建对象的四种方式(1.new 2.反射调用Constructor 3.clone 4.object反序列化),除反序列化外,上述四种设计模式均为如何创建对象的。
5.Observer观察者模式:首先定义一个接口,实现该接口的具体类在实例化时需要持有某个数据类Source实例的引用,并在适当的时机(如调用source实例的addObserver方法)加入到Collections中成为观察者或退出不观察,source实例通过iterator遍历这些实例,调用接口中定义的方法实现通知。
6.Decorator装饰器与Chain of Responsibility责任链模式:多个相同接口的类,一般构造参数为同一接口类型的具体对象,根据装饰路径或责任链路径,下一个类的实例将为上一个类实例提供额外的一些操作,对于装饰器而言,仅是增加一些修饰的处理并往下调用,而对于责任链模式而言,如果当前实例能够处理完成,可以不再往下调用,也可以对传入的链进行判断以确定是自己处理还是传递到下一个链处理。
7.Command命令与State状态:都是将行为和对象分开的模式,一般都得创建一些具体的行为类。命令模式把行为封装的更彻底,完全交给命令对象,而且各命令一般都不交叉,state模式略有不同,它的各state之间有一定的顺序关联,一般各state操作完后会设置"全局"的某个state以使整个状态链传动起来。
8.Adapter适配器,Composite组合模式与Iterator迭代器模式:都是通过继承覆写来维持某一些类的公共接口性,使得外界调用的代码只是和统一的接口来交互而并不关心内部如何实现,装适配器类是适配目标类或接口的子类,它将传入的对象改造成适配的目标类或接口,按照目标类所定义的方法,内部调用传入对象的方法或空方法(即传入对象无对应的方法可调)。组合模式一般用在树形结构中,就是将collection组合对象当单个对象来处理,可以理解为将组合对象适配成单个对象的调用,这样客户端不用区分是单个对象还是组合对象。迭代器模式可以理解为抽象出一组接口,用于遍历不同类型的集合。这两种模式可以理解为特殊的适配器模式。
9.Strategy策略模式与Bridge桥接模式:都是将抽象和行为分开,以解耦行为,方便动态的设置行为,对于策略模式,一般各行为都是相互独立的,依具体策略来设成某种行为。而Bridge更深入的把抽象也分离,抽象后各具体类能分别动态的设置其行为,也可以在抽象父类统一设置,这样各子类直接使用父类设置的行为。Bridge模式很好的诠释了针对抽象编程,有的书上写此模式为各模式之祖,诚以为然也。
10.Visitor访问者模式:感觉像操作委派,即被访问对象把操作权利完全委派给访问者,这样访问者就能自己控制操作。在一般情况下,如果要修改或新增一些功能,都或多或少涉及到对类结构或类层次的一些调整,而此模式通过accept一些visitor对象,并将自己(this)当成参数传给visitor的visit方法,实现操作委派。与命令模式相比,Visitor模式更强调其可扩展性,而命令模式更多的是强调行为完全有封装的命令对象负责,突出其封装性。
11.Mediator中介者模式与Facade外观模式:如果多个对象相互交错调用,为避免对象间的紧耦合,可以引入一个中介者类,引入各个参与对象,统一协调各对象的调用,对于具体的交互对象,只与中介者引用。中介模式更多的是体现在解耦各对象之间的关联,将此关联关系统一由中介对象管理,各对象间彼此独立。从效果上看,外观模式就是将一个或多个对象的几个方法组合起来放在一个方法里调用以提供便捷性而已,更多的只是强调其调用的组合便捷性。
12.其他模式:Proxy代理模式,Template模板方法,Memento备忘录,Interpreter解释器