Java面向对象程序设计的六大基本原则
文章目录
一、开闭原则
定义:
软件实体应该面向修改关闭,面向扩展开放。其实现的核心就是"抽象"。把我们的相同代码抽取出来,便于重用,这就是"闭"。把不同的代码也抽取出来,便于功能的扩展,这就是"开"。开闭原则是设计原则的核心原则,其他设计原则都是开闭原则的体现和补充。
二、里氏代换原则
1.定义
定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
定义2:子类型必须能够替换掉它们的父类型。
2、理解
里式替换原则:父类出现的地方子类一定可以替换。如果父类的方法在子类中不适用,或者在子类中发生畸变,则应该断开父子关系。父类的方法子类无条件继承,很可能导致父类方法在子类中不适用的情况。
里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。它包含以下4层含义:
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
2.子类中可以增加自己特有的方法。
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
4.当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
三、依赖倒置原则
定义
依赖倒置原则:面向抽象编程,不要面向具体编程。尽量使用抽象耦合代替具体耦合。
低耦合指的就是依赖倒置原则。
理解
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程,低层模块尽量都要有抽象类或接口,或者两者都有。
变量的声明类型尽量是抽象类或接口。
使用继承时遵循里氏替换原则。
四、接口隔离原则
定义
建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。
理解
我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
采用接口隔离原则对接口进行约束时,要注意以下几点:
- 接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。
- 为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。
- 提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。
接口隔离原则跟单一职责原则区别。
1、单一职责原则原注重的是职责;而接口隔离原则注重对接口依赖的隔离。
2、单一职责原则主要是约束类,其次才是接口和方法,它针对的是程序中的实现和细节;而接口隔离原则主要约束接口接口,主要针对抽象,针对程序整体框架的构建。
五、迪米特法则
定义
迪米特法则:软件实体之间应该尽量减少交互,不要因为一个类业务的变化而导致另一个类的变化,不和陌生人说话。
理解
迪米特法则又叫最少知道原则,最早是在1987年由美国Northeastern University的Ian Holland提出。通俗的来讲,就是一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。迪米特法则还有一个更简单的定义:只与直接的朋友通信。首先来解释一下什么是直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。其中,我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。
六、单一职责原则
定义
单一职责原则:一个类只应该有一个引起它变化的原因,不要让一个类拥有多种变化的理由。换句话说,一个类只应该完成和一个职责相关的业务,不要让一个类承担过多的职责。
粒度的大小根据业务来,一般来说简单的职责可以让一个类兼任。复杂职责,必须独立。(高内聚指的就是单一职责,一个类职责越单一,内聚越高)
单一职责原的优点有:
1.可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
2.提高类的可读性,提高系统的可维护性;
3.变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
七、组合/聚合复用原则
定义
聚合/组合复用原则:尽量使用聚合/组合完成代码复用,少用继承复用。继承在java中只能单根继承,不能通过继承实现多个类代码的复用。但是聚合/组合可以。
继承的缺点在于:父类的方法全部暴露给子类。父类如果发生变化,子类也得发生变化。聚合的复用的时候就对另外的类依赖的比较的少。
理解
组合/聚合复用原则可以使系统更加灵活,类与类之间的耦合度降低,一个类的变化对其他类造成的影响相对较少,因此一般首选使用组合/聚合来实现复用;其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。