七大软件设计原则
开闭原则
定义
一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节。
优点
提高软件系统的可复用性及可维护性
理解
通过继承覆盖,别乱改人家的
继承
图解
依赖倒置原则
定义
高层模块不应该依赖底层模块,二者都应该依赖其抽象,抽象不应该依赖细节;细节应该依赖抽象,针对接口编程,不要对实现编程。
优点
可以减少类间的耦合性、提高系统稳定性,提高代码可读性和可维护性,可降低修改程序所造成的风险。核心面向接口编程,面向抽象编程,将实例
对象通过接口传入
理解
高层(掉用者)依赖 底层(被调用者)不是其本身而是底层的接口。易于扩展、维护、理解。(如Spring依赖注入、策略模式)
依赖注入
图解
单一职责原则
定义
不要存在多于一个导致类变更的原因。一个类、接口、方法只负责一项职责
优点
降低类的复杂度、提高类的可读性、提高系统的可维护性、降低变更引起的风险
理解
功能拆分,变更只针对单个功能从而不影响大局。微服务也可以理解为单一指责
图解
接口隔离原则
定义
用多个专门的接口,而不是使用单一的总接口,客户端不应该依赖它不需要的接口
优点
高内聚、低耦合的设计思想,从而使得类具有很好的可读性,可扩展性和可维护性,主要就是抽取,解耦,不冗余
理解
接口细化,根据需求依赖需要的接口
图解
迪米特法则(最少知道原则)
定义
一个对象应该对其他对象保持最少的了解,又叫最少知道原则,尽量降低类与类之间的耦合
优点
降低类之间的耦合
理解
具体逻辑下沉,上层知道的越少越好,但也需要根据实际情况分析。
图解
里氏替换原则
定义
父类可以出现的地方,子类也可以出现;反过来不可以
引申意义
含义1:子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。 含义2:子类中可以增加自己特有的方法。 含义3:当子类的方法重载父类的方法时,方法的前置条件要比父类输入参数更加严格
优点
约束继承泛滥,开闭原则的一种体现;加强程序的健壮性,同时变更时也可以有更好的兼容性和扩展性,降低需求变更时的风险性
理解
版本兼容,新版可以扩展功能,旧功能逻辑可以优化但需保证功能结果和旧版的一致性。
图解
合成复用原则
定义
尽量使用对象组合、聚合、而不是继承关系达到软件代码复用的目的
优点
可以使系统更加灵活,降低类和类之间的耦合度,一个类的变化对其他造成的影响相对较少
理解
代码复用通过抽象在父类构造通用接口引用,可以在父类通过切换实现类的方式实现复用,而不是继承复用 多使用组合、聚合,能不继承就不继承
图解
设计模式分类
| 范围 目的 | 创建型模式 | 结构型模式 | 行为型模式 |
|---|---|---|---|
| 类模式 | 工厂方法 | (类)适配器 | 模板方法、解释器 |
| 对象模式 | 单例 原型 抽象工厂 建造者 | 代理 适配器 桥接 装饰 外观 享元 组合 | 策略 命令 职责链 状态 观察者 中介者 迭代器 访问者 备忘录 |