单一职责原则
单一职责原则的英文名称是Single Responsibility Principle,简称是SRP。SRP的原话解释是:There should never be more than one reason for a class to change。只要做过项目,肯定要接触到用户、机构、角色管理这些模块,基本上使用的都是 RBAC模型(Role-Based Access Control,基于角色的访问控制,通过分配和取消角色来完成 用户权限的授予和取消,使动作主体(用户)与资源的行为(权限)分离),确实是一个很 好的解决办法。
单一职责原则的定义是:应该有且仅有一个原因引起类的变更
里氏替换原则
Java使用extends关键字来实现继承,它采用了单一继承的规则,C++则采用了多重继承 的规则,一个子类可以继承多个父类。从整体上来看,利大于弊,怎么才能让“利”的因素发 挥最大的作用,同时减少“弊”带来的麻烦呢?解决方案是引入里氏替换原则(Liskov Substitution Principle,LSP),什么是里氏替换原则呢?它有两种定义:
● 第一种定义,也是最正宗的定义:If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.(如果对每一个类型为S的对象o1,都有类型为T的对 象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变 化,那么类型S是类型T的子类型。
● 第二种定义:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.(所有引用基类的地方必须能透明地使用其子类的 对象。
依赖倒置原则
依赖倒置原则(Dependence Inversion Principle,DIP)这个名字看着有点别扭,“依 赖”还“倒置”,这到底是什么意思?依赖倒置原则的原始定义是: High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions. 翻译过来,包含三层含义:
● 高层模块不应该依赖低层模块,两者都应该依赖其抽象;
● 抽象不应该依赖细节;
● 细节应该依赖抽象。
在Java语言中,抽象就是指接口或抽象类,两者都是不能直接被实例化的;细节就是实 现类,实现接口或继承抽象类而产生的类就是细节,其特点就是可以直接被实例化,也就是 可以加上一个关键字new产生一个对象。依赖倒置原则在Java语言中的表现就是:
● 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过 接口或抽象类产生的;
● 接口或抽象类不依赖于实现类;
● 实现类依赖接口或抽象类。 更加精简的定义就是“面向接口编程”——OOD(Object-Oriented Design,面向对象设 计)的精髓之一。
接口隔离原则
接口分为两种:
● 实例接口(Object Interface),在Java中声明一个类,然后用new关键字产生一个实 例,它是对一个类型的事物的描述,这是一种接口。比如你定义Person这个类,然后使用 Person zhangSan=new Person()产生了一个实例,这个实例要遵从的标准就是Person这个 类,Person类就是zhangSan的接口。疑惑?看不懂?不要紧,那是因为让Java语言浸染的时间 太长了,只要知道从这个角度来看,Java中的类也是一种接口。
● 类接口(Class Interface),Java中经常使用的interface关键字定义的接口。
那什么是隔离呢?它有两种定义,如下所示:
● Clients should not be forced to depend upon interfaces that they don't use.(客户端不应该依 赖它不需要的接口。
● The dependency of one class to another one should depend on the smallest possible interface. (类间的依赖关系应该建立在最小的接口上。
迪米特法则
迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP),虽然名字不同,但描述的是同一个规则:一个对象应该对其他对象有最 少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调 用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public 方法,我就调用这么多,其他的我一概不关心。
开闭原则
开闭原则的定义: Software entities like classes,modules and functions should be open for extension but closed for modifications.(一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。