面向对象六大设计原则


单一职责原则(Single Responsibility Principle)

主要指的是一个类,方法,接口中只实现单一职责,这样能够提升代码可读性,可维护性也大大提高,有效避免了屎山代码的出现(确信),进行功能变更时的风险也会降低.

开闭原则(Open Closed Principle)

对于扩展开放,对于修改封闭.

一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码实现变化.这是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则.

比如一个类可能有多方需要调用,有时部分调用方有了新的需求,这时不能直接修改类的代码来更改功能,而是需求方将这个类继承过去再进行添加,修改功能,这样出问题不会影响其他调用方,真正做到高内聚,低耦合.

其实类的例子还不够准确,一般都是先将职责方法抽象成接口,然后再根据各自需求的不同进行具体实现.

里式替换原则(Liskov Substitution Principle)

所有引用基类的地方必须能够透明地使用其子类的对象.

通俗点说,只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何异常.但是反过来就不行了,因为子类可以扩展父类没有的功能,同时子类还不能改变父类原有的功能.

里氏替换原则为良好的继承定义了一个规范,它包含了4层含义:

1、子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法.

2、子类可以有自己的个性,可以有自己的属性和方法.

3、子类覆盖或重载父类的方法时输入参数可以被放大.

4、子类覆盖或重载父类的方法时输出结果可以被缩小,也就是说返回值要小于或等于父类的方法返回值.

迪米特法则(Law of Demeter)

一个对象应尽量减少对其他对象的了解.

一个类应该对自己需要耦合或调用的类知道的最少,类与类之间的关系越密切,耦合度越大,那么类的变化对其耦合的类的影响也会越大,这也是我们面向设计的核心原则:高内聚,低耦合.

接口隔离原则(Interface Segregation Principle)

客户端不应该依赖它不需要的接口

意思就是客户端需要什么接口就提供什么接口,把不需要的接口剔除掉,这就需要对接口进行细化,保证接口的纯洁性。换成另一种说法就是,类间的依赖关系应该建立在最小的接口上,也就是建立单一的接口。

你可能会疑惑,建立单一接口,这不是单一职责原则吗?其实不是,单一职责原则要求的是类和接口职责单一,注重的是职责,一个职责的接口是可以有多个方法的,而接口隔离原则要求的是接口的方法尽量少,模块尽量单一,如果需要提供给客户端很多的模块,那么就要相应的定义多个接口,不要把所有的模块功能都定义在一个接口中,那样会显得很臃肿。

依赖倒置原则(Dependency Inversion Principle)

高层模块不应该依赖底层模块,两者都应该依赖其抽象;
抽象不应该依赖细节;
细节应该依赖抽象.

抽象就是指接口或抽象类,两者都不能被实例化;而细节就是实现接口或继承抽象类产生的类,也就是可以被实例化的实现类。依赖倒置原则是指模块间的依赖是通过抽象来发生的,实现类之间不发生直接的依赖关系,其依赖关系是通过接口是来实现的,这就是俗称的面向接口编程。

不知道有没有细心的同学发现,这六大原则的首字母可以组成一个单词:SOLID,可能这就是这六大设计原则想达到的目标吧.

References