作者: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.功能拆分