常用设计原则(精华篇)

作者:haibiscuit

时间:2019:3:6

您的star是我不断前行的动力

https://github.com/haibiscuit

转载请说明出处

前言:
面向对象设计的目标在于支持可维护性复用:
一方面需要实现设计方案和源代码的复用,
另一方面要确保系统易于扩展和修改,具有良好的可维护性。
一:经常用到的设计原则
使用频率
单一职责原则 ****
开闭原则 *****
里氏代换原则 *****
依赖倒转原则 *****
接口隔离原则 **
合成复用原则 ***

一:单一职责原则(用于控制类的粒度大小)
定义:一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。

例如:图表统计模块
CustomerDataChart类 (封装了如下的行为)
GetConnection():Connection //用于连接数据库
FindCustomers():List //用于查询所有的客户信息
CreateChart():void //用于创建图表
DisplayChart():void //用于显示图表

以上的问题:
CustomerDataChart类承担了太多的职责
1.既包含与数据库相关的方法
2.又包含与图表显示相关的方法
解决问题:
将CustomerDataChart类拆分成三个类
1.DBUtil:负责连接数据库,包含数据库连接方法,GetConnetcion().
2.CustomerDao:负责操作数据库中的Customer表,包含对Customer表的增删改查,例如FindCustomers().
3.CustomerDataChart:负责图表的生成和显示,包含方法CreateChart()和DisplayChart().

二:开闭原则(需要做到不修改原来代码的基础上扩展系统的功能)
定义:软件实体对扩展开放,对修改关闭。

重点:
1.为了满足开闭原则,需要对系统进行抽象化的设计,抽象化是开闭原则的
关键。
2.可以为系统定义一个相对稳定的抽象层,而将不同的额实现行为移至具体 的实现层中完成。
3.可以通过接口、抽象类等机制来定义系统的抽象
4.如果想修改系统的行为,无须对系统的抽象层进行任何的修改,只需要增加
新的具体类来实现新的业务,实现再不修改已有的代码的基础上扩展系统的功能。

三:里氏代换原则(即运行时基类调用子类实现的方法)
定义:所有引用基类的地方必须能透明地使用其子类的对象

重点:
1.应该将父类设计成抽象类或接口,让子类继承父类或实现父类接口,并实现父类中声明的方法。运行时,子类实例替换父类实例,可以很方便的扩展系统的功能,无须修改原有子类的代码,增加新的功能可以通过增加新的子类来实现。

四:依赖倒转原则(要针对接口编程,不要针对实现编程)
定义:高层模块不应该依赖底层模块,他们都应该依赖抽象。抽象不应该依赖于细
节,细节应该依赖于抽象。

重点:
1.使用接口和抽象类进行变量类型声明,参数类型声明,方法返回类型声明 ,以及数据类型的转换等,而不要用具体类来做这些事情。
2.在实现依赖倒转原则时,需要针对抽象层进行编程,而将具体类的对象通 过依赖注入的方式注入到其他对象中。
3.依赖注入是指,一个对象要与其他对象发生依赖时,通过方法参数来注入 所依赖的对象。常用的方法有三种(构造注入,设值注入和接口注入)。
4.这些方法在定义时使用的抽象类型,在运行时再传入具体的对象,由子类
对象来覆盖父类对象。

五:接口隔离原则
定义:客户端不应该依赖那些它不需要的接口

重点:
1.根据接口隔离原则,当一个接口太大时,需要将它分割成一些更细小的接 口,使用该接口的客户端需要知道与之相关的接口即可。

六:合成复用原则(要尽量使用组合/聚合关系,少用继承)
定义:优先使用对象组合,而不是继承来达到复用的目的。

重点:
1.一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用的目的。

例如:
在设计数据库连接操作的时候可以基于以下设计。
组件为CustomerDao、DBUtil、OracleDBUtil、MysqlDBUtil
组件介绍:
1.CustomerDao:依赖DBUtil类,用于数据库的操作
2.DBUtil:可以是抽象类,或接口,或具体类,用于获取不同数据库连接
3.OracleDBUtil:实现或继承DBUtil类,用于获取Oracle数据库的连接。
4.MysqlDBUtil:实现或继承DBUtil类,用于获取Mysql数据库的连接。

这样,如果需要其他数据库的连接操作,只需要继承或实现DBUtil类即可,达到了可扩展性。

总结:
1.依赖注入可通过构造注入,设值注入和接口注入实现
2.设计模式无非是为了考虑设计的可扩展性和可维护性,
主要需要考虑到可变的部分,
例如在不需要修改原有代码的情况下,通过继承、实现等方式来增加新的功能,达到可扩展性,
例如通过组件(类或行为)的单一职责,达到组件的可维护性
例如通过合成复用原则,达到组件的复用,提高系统的灵活性
...

设计模式的思想:
1.多用接口和抽象编程
2.单一职责
3.多用组合/聚合,少用继承
4.功能拆分

原文地址:https://www.cnblogs.com/haibiscuit/p/10484578.html