设计原则
一、单一职责(高内聚,低耦合的指导方针)
为什么要有单一职责?
复用角度:一个类承担的职责越多,被复用的可能性就越小。
变化角度:当其中一个职责发生吧变化,可能会影响到其他职责的运作。
案例分析
getConnection()方法用于连接数据库,findCustomers()方法用户查询所有的客户信息,createChart()用户创建图表,displayChart()用于显示图表。一个CustomerDataChart类具有四个职能,而这四个职能的变化都会引起CustomerDataChart类的变化。复用性和和维护性都受到了限制,现在使用单一职责对其进行重构。
优化后
我们将上面的类按照职能的不同划分为三个类
CustomerDataChart类--处理与图表有关的操作
CustomerDAO类--处理对数据表的增删改查有关操作
DBUtil类--处理与数据库的连接有关操作
二、开闭原则(抽象化)
可复用的第一块基石
相对稳定的抽象层+灵活的具体层
对可变性封装原则:找到系统的可变因素,并将其封装起来。
三、里式替换(开闭原则的重要方式之一)
在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。
在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型。
四、依赖倒置(针对接口编程)
针对接口编程,不要针对具体实现编程,具体类写在配置文件中。
针对抽象层编程,将具体类的对象通过依赖注入的方式注入到其他对象
依赖注入的三个方式
- 构造注入
- 设值注入(Setter注入)
- 接口注入
案例分析
优化后:
五、接口隔离
客户不应该依赖哪些它不需要的接口。
案例分析
优化后:
六、迪米特法则
一个软件实体应当尽可能少与其他实体发生相互作用。
通过引入一个合理的“第三者”来降低现有对象之间的耦合度。
案例分析
优化后
七、合成复用
优先使用对象组合,而不是继承来达到复用的目的。
在一个新的对象里通过关联关系(包括组合,聚合)来使用一些已有的对象,使之成为新对象的一部分。
案例分析
优化后