一个类只负责一项职责。 当超过一项职责须要负责时,须要增长新的类来负责新的职责,而不是在类中个性代码。html
若是一个类承担的职责太多,就是高度地职责耦合,很是不利于扩展功能。这是很是脆弱的设计。 容易发生修改一个地方而影响其余地方的状况。java
遵循单一职责原则的优势:编程
里氏代换原则(Liskov Substitution Principle, LSP):全部引用基类(父类)的地方必须能透明地使用其子类的对象。设计模式
里氏代换原则告诉咱们,在一个软件系统中,子类应该能够替换任何基类可以出现的地方,而且通过替换之后,代码还能正常工做。子类也可以在基类的基础上增长新的行为。架构
例若有两个类,一个类为BaseClass,另外一个是SubClass类,而且SubClass类是BaseClass类的子类,那么一个方法若是能够接受一个BaseClass类型的基类对象base的话,如:method1(base),那么它必然能够接受一个BaseClass类型的子类对象sub,method1(sub)可以正常运行。反过来的代换不成立,如一个方法method2接受BaseClass类型的子类对象sub为参数:method2(sub),那么通常而言不能够有method2(base),除非是重载方法。函数
里氏代换原则是实现开闭原则的重要方式之一,因为使用基类对象的地方均可以使用子类对象,所以在程序中尽可能使用基类类型来对对象进行定义,而在运行时再肯定其子类类型,用子类对象来替换父类对象。字体
包含4层含义:spa
不遵循里氏代换原则的后果是,写代码出错的机率会大大增长。.net
定义:1.高层模块不该该依赖低层模块,两者都应该依赖其抽象; 2.抽象不该该依赖细节;细节应该依赖抽象。设计
问题由来:类A直接依赖类B,假如要将类A改成依赖类C,则必须经过修改类A的代码来达成。这种场景下,类A通常是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操做;假如修改类A,会给程序带来没必要要的风险。
解决方案:将类A修改成依赖接口I,类B和类C各自实现接口I,类A经过接口I间接与类B或者类C发生联系,则会大大下降修改类A的概率。
依赖倒置原则基于这样一个事实:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。在java中,抽象指的是接口或者抽象类,细节就是具体的实现类,使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操做,把展示细节的任务交给他们的实现类去完成。
传递依赖的三种写法:
1.构造函数传递依赖对象
2.Setter方法传递依赖对象
3.接口声明传递依赖对象
深刻了解能够看:轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)
举例来讲明接口隔离原则:
(图1 未遵循接口隔离原则的设计)
这个图的意思是:类A依赖接口I中的方法一、方法二、方法3,类B是对类A依赖的实现。类C依赖接口I中的方法一、方法四、方法5,类D是对类C依赖的实现。对于类B和类D来讲,虽然他们都存在着用不到的方法(也就是图中红色字体标记的方法),但因为实现了接口I,因此也必需要实现这些用不到的方法。
能够看到,若是接口过于臃肿,只要接口中出现的方法,无论对依赖于它的类有没有用处,实现类中都必须去实现这些方法,这显然不是好的设计。若是将这个设计修改成符合接口隔离原则,就必须对接口I进行拆分。在这里咱们将原有的接口I拆分为三个接口,拆分后的设计如图2所示:
(图2 遵循接口隔离原则的设计)
迪米特法则有不少种说法,好比:一个类应该应该对其余类尽量了解得最少;类只与直接的朋友通讯等等。可是其最终目的只有一个,就是让类间解耦。
就是说一个对象应该对其余对象保持最少的了解。正如最少知识原则这个定义同样,一个类应该对其耦合的其余类或所调用的类知道得最少。所耦合的类内部不管如何复杂,怎么实现的我都不须要知道,我只调用你public出来的这些方法,其余都不用知道。
所谓开放封闭原则就是软件实体应该对扩展开放,而对修改封闭(不须要修改接口,就能实现新的需求)。开放封闭原则是全部面向对象原则的核心。软件设计自己所追求的目标就是封装变化,下降耦合,而开放封闭原则正是对这一目标的最直接体现。
开放封闭原则主要体如今两个方面:
为何要用到开放封闭原则呢?
软件需求老是变化的,世界上没有一个软件的是不变的,所以对软件设计人员来讲,必须在不须要对原有系统进行修改的状况下,实现灵活的系统扩展。
如何作到对扩展开放,对修改封闭呢?
实现开放封闭的核心思想就是对抽象编程,而不对具体编程,由于抽象相对稳定。让类依赖于固定的抽象,因此对(抽象类)修改就是封闭的;而经过面向对象的继承和多态机制,能够实现对抽象体的继承,经过覆盖其方法来改变固有行为,实现新的扩展方法,因此对于扩展就是开放的(即对接口添加新的实现类来知足新的需求)。
对于违反这一原则的类,必须经过重构来进行改善。经常使用于实现的设计模式主要有Template Method模式和Strategy 模式。而封装变化,是实现这一原则的重要手段,将常常变化的状态封装为一个类。
代码参考例子:以银行业务员为例