Java设计类原则

Java设计类原则_第1张图片

一、面向对象设计原理:

1、单一职责原则

1)、定义:
一个类,只有一个引起它变化的原因。应该只有一个职责。每一个职责都是变化的一个轴线,如果一个类有一个以上的
职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其它的职责。另外,多个
职责耦合在一起,会影响复用性。
2)、遵循单一职责的优点:
可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
提高类的可读性,提高系统的可维护性;
变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其它功能的影响。

2、开闭原则

1)、定义:
一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
一个软件实体应该通过扩展来实现变化,而不是通过已有代码来实现变化。
2)、如何使用开闭原则
(1)、抽象约束
通过接口或者抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法
参数类型、引用对象尽量使用接口或者抽象类,而不是实现类;
抽象层尽量保持稳定,一旦确定即不允许修改。
(2)、元数据(metadata)控制模块行为
元数据就是用来描述环境和数据的数据,通俗地说就是配置参数,参数可以从文中获得,也可以
从数据库中获得。
Spring容器就是就是一个典型的元数据控制模块行为的例子,其中达到极致的就是控制反转。
(3)、制定项目章程
在一个团队中,建立项目章程是非常重要的,因为章程中指定了所有人员都必须遵守的约定,对项目来说,约定优于配置。
(4)、封装变化
对变化的封装包含两层含义:
第一,将相同的变化封装到一个接口或者抽象类中;
第二,将不同的变化封装到不同的接口或抽象类,不应该有两个不同的变化出现在同一个接口或抽象类。

3、依赖倒置原则(核心思想是面向接口编程)

1)、定义:
就是要依赖于抽象,不要依赖于具体。实现开闭原则的关键是抽象化,并且从抽象化导出具体化实现,
如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要手段。
高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
2)、传递依赖关系有三种方式:
使用的方法是接口传递;
构造方法传递;
setter方法传递;
3)、在实际编程中,我们一般需要做到如下三点:
底层模块尽量都要有抽象类或接口,或者两者都有。
变量的声明类型尽量是抽象类或接口;
使用继承时遵循里氏替换原则;

4、接口隔离原则:

1)、定义:
客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
2)、采用接口隔离原则对接口进行约束时,要注意以下几点:
(1)、接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性,但是如果过小,
则会造成接口数量过多,使设计复杂化。所以一定要适度。
(2)、为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则
隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小地依赖关系。
(3)、提高内聚,减少对外交互。使接口用最少地方法去完成最多的事情。

5、里氏替换原则:

1)、定义:
所有引用基类的地方必须能透明地使用其子类的对象。
2)、继承优点:
代码共享,减少创建类的工作量,每个自类都拥有父类的方法和属性;
提高代码的重用性;
子类可以形似父类,但又异于父类;
提高代码的可扩展性,实现父类的方法就可以"为所欲为"了,君不见很多开源框架的扩展
接口都是通过继承父类完成的;
提高产品或项目的开放性;
3)、继承缺点:
继承是侵入性。只要继承,就必须拥有父类的所有属性和方法;
降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;
增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏管饭的环境下,
这种修改可能带来非常糟糕的结果—大段代码需要重构;
4)、里氏替换原则为良好的继承定义了一个规范,一句简单的定义包含了4层含义:
(1)、子类必须实现父类的方法
(2)、子类可以有自己的个性
(3)、覆盖或实现父类的方法时输入参数可以被放大
(4)、覆写或实现父类的方法时输出结果可以被缩小

6、合成/聚合复用原则

1)、定义:
在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的
目的。应首先使用合成/聚合,合成/聚合则使系统灵活,其次才考虑继承,达到复用的目的。而使用继承时,要严格
遵循里氏替换原则。有效地使用继承会有助于对问题的理解,降低复杂度,而滥用继承会增加系统构建、维护时的难度及系统的复杂度。
2)、什么是聚合:
合成和聚合都是关联的特殊种类。
聚合表示整体和部分的关系,表示"拥有"。如奔驰S360汽车,对奔驰S360引擎、奔驰S360轮胎的关系是聚合关系,离开了奔驰S360汽车,引擎、轮胎
就失去了存在的意义。在设计中, 聚合不应该频繁出现,这样会增大设计的耦合度。
3)、什么是合成:
合成则是一种更强的"拥有",部分和整体的生命周期一样。合成的新的对象完全支配其组成部分,包括它们的创建和湮灭等。一个合成关系的成分对象是不能与另一个合成关系共享的。
换句话说,合成是值的聚合(Aggregation by Value),而一般说的聚合是引用的聚合(Aggregation by Reference)。
4)、合成/聚合的优点、缺点:
优点:(1)、新对象存取对象的唯一方法是通过成分对象的接口。
(2)、这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不见的。
(3)、这种复用支持包装。
(4)、这种复用所需的依赖较少。
(5)、每一个新的类可以将焦点集中在一个任务上。
(6)、这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象。
(7)、作为复用手段可以应用到几乎任何环境中去。
缺点:就是系统中会有较多的对象需要管理。
5)、通过继承来进行复用的优缺点:
优点:(1)、新的实现较为容易,因为超类的大部分功能可以通过继承的关系自动进入子类。
(2)、修改和扩展继承而来的实现较为容易。
缺点:(1)、继承复用破坏包装,因为继承将超类的实现细节暴露给子类。由于超类的内部细节常常是对于子类透明的,
所以这种复用是透明的复用,又称"白箱"复用。
(2)、如果超类发生改变,那么子类的实现也不得不发生改变。
(3)、从超类继承而来的实现是静态的,不可能在运行时间内发生改变,没有足够的灵活性。
(4)、继承只能在有限的环境中使用。

7、迪米特法则(最少知道原则)

1)、定义:
一个对象应该对其它对象保持最少的了解。
问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
解决方案:尽量降低类与类之间的耦合。
迪米特法则的初衷是降低类之间的耦合,由于每个类都减少了不必要的依赖,因此的确可以降低耦合关系。但是凡事都有度,虽然可以避免与非直接的类通信,但是要通信,必然会通过一个“中介”来发生联系,
例如本例中,总公司就是通过分公司这个“中介”来与分公司的员工发生联系的。过分的使用迪米特原则,会产生大量这样的中介和传递类,导致系统复杂度变大。所以在采用迪米特法则时要反复权衡,既做到结构清晰,
又要高内聚低耦合。

总结:

用抽象构建框架,用实现扩展细节的注意事项而已:
1、单一职责原则告诉我们实现类要单一;
2、里氏替换原则则告诉我们不要破坏继承体系;
3、依赖倒置原则则告诉我们要面向接口编程;
4、接口隔离原则则告诉我们在设计接口的时候要精简单一;
5、迪米特法则告诉我们要降低耦合;
6、合成/聚合复用原则告诉我们开发程序要尽可能的简单高效;
7、开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。

参考博客:https://blog.csdn.net/qq_37651267/article/details/90648029

你可能感兴趣的:(Java设计类原则)