1、单一职责原则(Single Responsibility Principle)
“一个类只做一件事,引起它变化的原因只有一个。”
一个接口只做一件事情。
尽量避免修改一个功能时,影响太多其他的东西,这个原则的划分细粒度是一个难点,只能通过工作经验的积累才能更好的应用。
1、定义:应该有且只有一个原因引起类的变更。换句话说就是一个接口只做一件事,即一个职责一个接口。但是困难的是划分职责时并没有一个标准,最终都是需要从实际的项目去考虑。
注意,在设计时,尽量职责单一,对于其实现类就要多方面的考虑。不能死套单一职责原则,否则会增加很多类,给维护带来不便。
2、开闭原则(Open Closed Principle )
对修改关闭,对扩展开放。提供良好的可扩展性和易维护性。
1、定义:开闭原则是Java里最基础的设计原则。具体的定义是:一个软件实体,比如类,模块,函数应该对扩展开放,对修改关闭。一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现改变。
3、里氏代换原则(Liskov Substitution Principle )
即子类可以代替父类的全部功能,反过来就不行。
1、 定义:里氏替换原则----只要父类出现的地方子类就可以出现,且替换成子类也不会出现任何错误或者异常。(但是反过来,有子类出现的地方,父类不一定可以适用)。
2、里氏替换原则是为继承定义了四个规范
4、依赖倒转原则(Dependence Inversion Principle)
即高层代码不应该依赖于底层代码,而应该依赖于接口,即面向接口编程。在Java语言中的表现就是为以下的三点:
(1)模块间的依赖关系通过接口和抽象类产生,实体类之间不直接发生依赖关系;
(2)接口和抽象类不依赖于实现类;
(3)实现类依赖接口或者抽象类;
对象的依赖关系有三种实现方式
(1)构造函数传递依赖对象;
(2)Setter接口传递依赖对象;
(3)接口声明依赖对象,也叫接口注入;
注,构造函数传递方式与接口注入方式的区别
5、迪米特法则(Law of Demeter)
1、定义:迪米特法则也叫做最少知识原则(Least Knowledge Principle,LKP),即一个对象应该对其他对象有最少的了解,也就是说一个类要对自己需要耦合或者调用的类知道的最少。我只知道你有多少public方法可以供我调用,而其他的一切都与我无关。
2、迪米特法则是对类的低耦合做处理明确的要求。例如:学校领导老师点名,老师让体育委员清点人数。其中第二段代码的耦合性较第一段代码有所改善。
3、迪米特法则的核心观念就是类间解耦,最终可能产生的结果就是会产生了大量的中转类。为了把解耦做到极致导致实现一个业务逻辑的实现跳转了很多类,这也是不可取的做法。因此根据实际权衡利弊才是重要的。
6、接口隔离原则(Interface Segregation Principle)
1、定义:建立单一接口,不要建立臃肿庞大的接口。即接口尽量细化,同时接口中的方法尽量少。
在这里提一下单一职责和接口隔离原则的区别。首先两个侧重点是不一样的,单一职责要求类和接口,或者方法的职责单一,侧重点在职责,这是根据业务逻辑进行划分的。而接口隔离原则要接口中的方法尽量少。比如,一个接口或者一个中有十个方法,不同的方法做不同的事情,但是这个接口总体就是处理一件事情,然后具体细分成了10个方法。不同的模块根据不同的权限进行访问,这是符单一职责原则的。但是按照接口隔离的原则是要求接口中的方法尽量少,落实到这个实例就是要求尽量多几个专门的接口供不同的模块使用,而不是只有一个臃肿的接口,依据权限去限制不同模块可以访问的方法。
2、接口隔离原则是对接口定义的规范。
含义主要包含以下4点:
接口尽量小,根据具体业务把一个接口按照接口隔离原则细化成更多的接口。但是在此基础之上必须不能违背单一职责原则。
接口要高内聚。高内聚的意思就是提高接口和类处理能力,减少对外的交互。接口是对外的承诺,因此设计时应该尽量少公布接口中的public方法,承诺越少系统开发越有利且变更风险就越少。
定制服务。定制服务就是单独为一个个体提供服务,即只提供访问者需要的方法。
接口设计是有限度的。接口设计越小越好,但是结构同时会变得复杂,维护也变得难了。因此就要把握住这个度。