设计模式之六大原则

一、单一职责原则(Single Responsibility Principle,SRP)

定义:指一个类或者模块应该有且只有一个改变的原因.即一个类只负责一项工作.

二、开闭原则(Open Close Principle,OCP)

定义:软件中的对象(类、模板、函数等)应该对于扩展是开放的,但是对于修改是封闭的.

三、里氏替换原则(Liskov Substitution Principle,LSP)

第一种定义:如果对每一个类型为S的对象O1,都有类型为T的对象O2,使得以T定义的所有程序P在所有的对象O1都代换成O2时,程序P的行为没有发生变化,那么类型S是类型T的子类型.
第二种定义:所有引用基类的地方必须能够透明地使用其子类的对象.
里氏替换原则就是依赖于继承和多态这两大特性,通俗地说:只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或者异常,使用者可能根本就不知道这是父类还是子类.反过来就不行.
简单的是说里氏替换原则的核心原理就是抽象(抽象本就依赖于继承这一特性),东西都是有两面性的,由于继承的优缺点导致该原则也有这些优缺点:
优点:1) 代码重用,减少创建类的成本,每个子类有拥有父类的所有方法和属性;
2) 子类与父类基本相似,当也有区别;
3) 提高代码的可扩展性.
子类可以扩展父类的功能,但不能改变父类原有的功能.这句话包含 四层含义:
1) 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法;
2) 子类可以增加自己特有的方法;
3) 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松;
4) 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类的严格.

缺点:1) 只要子类继承父类,那么就必须包含所有父类的方法和属性;
2) 可能会造成子类的代码冗余,灵活性减低.

四、依赖倒置原则(Dependence Inversion Principle,DIP)

依赖倒置原则表述的是一种特定的解耦形式,使得高层次的模块(调用端)不依赖与低层次的模块(具体实现类)的实现细节和目的,依赖模块被颠倒了.
关键点:
1) 高层模块不应该依赖于底层模块,两者都应该依赖其抽象;
2) 抽象不应该依赖于细节;
3) 细节应该依赖抽象.
具体表现:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的.

五、接口隔离原则(InterfaceSegregation Principle,ISP)

定义:客户端不应该依赖它不需要的接口.(类之间的依赖关系应该建立在最小的接口上)

六、迪米特原则(也称最少知识原则)(Law of Demeter,LOD)

定义:一个对象应该对其他对象有最少的了解(一个类应该对自己的需要耦合或者调用的类知道得最少,类的内部如何实现与调用者或者依赖这没有关系,调用者或者依赖者只需要知道它所需要的方法即可,其它的一概不管)