4.2 面向对象设计7大原则
设计实现一个系统时,我们一般先按功能划分好模块,以模块中核心类为起点,根据功能逐步向周边延展设计其它类。
设计模式在这个过程中可以帮助我们进行高质量的代码设计。但是模式是有限的,这些优秀的设计模式背后有没有什么通用的指导原则呢?
依赖倒置原则:面向接口编程,不要针对实现编程。实现意味着应对变化的能力下降,尽量延迟到调用时再具体化。
开闭原则:对扩展开放,对修改关闭。比较好理解,扩展新增引入的风险相对修改更可控一些。修改往往意味着,系统扩展性不够。
里氏替换原则:继承父类的目的是为了复用。高质量的继承关系,是衍生类可以完全替换掉基类,并且系统的行为不受到影响。如果子类不能完全替换父类,说明继承是不彻底的,复用的目的就没有达到。
单一职责原则:一个类应该只承担一个职责。承担的职责过多,职责之间可能会相互耦合。这里最难的就是划分职责,职责必须恰如其分地表现实体的行为。比如用户账号可以修改基础信息,会员可以持有会员卡。如果不加以区分,只抽象一个用户实体包括所有的行为,显然是不合适的。
接口隔离原则:适度细化接口,接口的行为尽量少。分治的思想,降低复杂性,系统更可控。
迪米特法则:一个类对依赖的类知道的越少越好。本质目的是将复杂度控制在一定范围内。
组合/聚合复用原则:复用即可以通过继承实现,也可以通过组合 / 聚合实现。区别在于,继承表达 is-a的逻辑关联,目的在描述结构,而不是复用。
------
面向对象设计七大原则:“开闭原则”是总纲,告诉我们要“对扩展开放,对修改封闭”;“里氏替换原则”告诉我们“不要破坏继承体系”;“依赖倒置原则”告诉我们要“面向接口编程”;“单一职责原则”告诉我们实现类要“职责单一”;“接口隔离原则”告诉我们在设计接口时要“精简单一”;“迪米特法则”告诉我们要“降低耦合度”;“合成复用原则”告诉我们要“优先使用组合或者聚合关系复用,少用继承关系复用”
---------
开闭原则:对拓展开放,对修改关闭。
里氏替换原则:不该破坏类的继承体系,不应该复写父类的方法,子类可以拓展父类功能,但不能改变父类原有的功能。
依赖倒置原则:面向接口编程,而不是面向实现编程。
单一职责原则:尽量保持实现类的职责单一。
接口隔离原则:设计接口的时候要精简单一。
迪米特法则:降低耦合度,只和你的朋友交流。
合成复用原则:优先使用组合聚合关系,代替继承关系。
开闭原则实现途径:
里氏替换原则
依赖倒置原则
高内聚低耦合:
单一职责原则
接口隔离原则
迪米特法则
合成复用原则
面向对象编程时有以下几个选择:
1,多用组合,少用继承
2,针对接口编程,不针对实现编程
3,为交互对象之间的松耦合设计而努力
4,类应该对扩展开放,对修改关闭
5,依赖抽象,不要依赖具体类
设计模式-六大原则、模式类型、规则
一、面向对象的规则
1.1、对接口进行编程,而不是对实现进行编程
1.2、优先使用组合,而不是继承
二、设计模式的类型
2.1、创建型
创建对象的同时隐藏创建逻辑的方式。不是每次都采用对象,直接实例化。
2.2、结构型
关注类和对象的组合。组合接口和定义组合对象,获得新功能。
2.3、行为型
关注的是对象之间的通讯。
三、设计模式的六大原则
3.1、开闭原则
对扩展开放,对修改关闭。方便维护和升级。
3.2、里氏代换原则
基类可以出现的地方,子类可以出现。派生类可以覆盖基类的功能。是对开闭原则的执行策略。
3.3、依赖倒转原则
是开闭原则的基础,对接口抽象进行编程,不依赖于具体的实体。
3.4、接口隔离原则
使用多个隔离的接口,好过单一的接口。降低类之间的耦合度。
3.5、迪米特,最少知道法则
实体之间,尽量减少相互作用。高内聚。
3.6、合成复用原则
尽量使用合成,聚合的方式,少用继承。
设计原则及设计模式(一)
DIP:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
核心思想是面向接口编程。SRP:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。
也许会有职责扩散问题,在职责扩散到我们无法控制的程度之前,立刻对代码进行重构。
ISP:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
OCP:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
LSP:所有引用基类的地方必须能透明地使用其子类的对象。
里氏替换原则通俗的来讲就是:子类可以扩展父类的功能,但不能改变父类原有的功能。它包含以下4层含义:
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
最少知识原则:一个对象应该对其他对象保持最少的了解。
最后更新于 2021年5月6日