在面向对象软件系统中,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。而可维护性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计的思想,可以从不同的角度提升一个软件结构的设计水平。
现在我们就了解一下这六种设计模式:
一、单一职责原则:
定义:就一个类而言,应该只有一个引起它变化的因(一个类只负责一个功能领域中的相应职责)。
问题由来:一个类T有俩个不同的功能f1、f2,当f1发生改变而需要修改类T时,有可能会导致原本运行正常 的f2功能发生故障。
解决方案:分别建立两个类T1、T2,使T1完成职责f1功能,T2完成职责f2功能。这样,当修改类T1时,不会 使职责f2发生故障风险;同理,当修改T2时,也不会使职责f1发生故障风险。
单一职责原则是实现高内聚、低耦合的指导方针。
二、开放—封闭原则:
定义:软件实体可以扩展,但是不可修改。
问题由来:在软件的生命周期内,如果有变化、升级和维护等原因需要对软件原有代码进行修改时,不至于 把整个程序推到重来。
解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实 现变化。
抽象化是开闭原则的关键
三、依赖倒转原则
定义:抽象不应该依赖细节,细节应该依赖抽象(针对接口编程,不要对实现编程)。
问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下, 类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程 序带来不必要的风险。
解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则 会大大降低修改类A的几率,从而降低给程序带来的风险。
强内聚、松耦合,面向对象设计的标志。
四、里氏代换原则
定义:子类型必须能够替换掉它们的父类型。
问题由来:有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与 新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,有可能会导致原有功能P1发生 故障。
解决方案:当类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要 重载父类A的方法。
是实现开环原则的重要方式之一,使用继承(IS—A)时,严格遵守该原则。
五、迪米特法则
定义:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用 另一个类的某一个方法的话,可以通过第三者转发这个调用。
问题由来:类与类之间的耦合越紧密,当一个类发生改变时,另一类也很容易改变。
解决方案:降低类与类之间的联系。
降低耦合度
六、合成/聚合复用原则
定义:尽量使用合成/聚合,尽量不要使用类继承。
问题由来:如果一味的使用继承,可能会导致系统成为一个不可控制的庞然大物,增加了系统维护的难度。
解决方案:使用合成/聚合复用原则,使类与类继承层次会保持一个较小的规模,使系统更加灵活。
如果两个类之间是“Has-A”的关系应使用组合或聚合。