设计原则与设计模式(总览)

六大设计原则

| 开闭原则(Open-Closed Principle) | 对扩展开放,对修改关闭 |
| ---- | ---- | ---- |
| 依赖倒置原则(Dependence Inversion Principle) | 面向接口编程 - 抽象构建框架,实现扩展细节 |
| 单一职责原则(Single Responsibility Principle) | 一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分 |
| 接口隔离原则(Interface Segregation Principle) | 对外暴露尽可能少的接口,利于维护和拓展(低耦合高内聚) |
| 迪米特法则(Law of Demeter)/最少知道原则(Least Knowledge Principle) | 程序建模指导:①只依赖必须依赖的类 ②尽可能少暴露接口 ③如果软件实体无需直接通信,可通过第三方转发(实例:中介者模式,访问者模式等) |
| 里氏替换原则(Liskov Substitution Principle) | 在子类被当作其父类使用时,其应有和父类相同的行为逻辑 |
| 合成复用原则(Composite Reuse Principle) | 尽量使用组合关系(弱耦合)实现代码复用,而非继承关系(强耦合) |
里氏替换原则中:子类无法作为父类使用时,应采用关联委托关系进行建模(组合关系)

创建型模式:

单例模式:饿汉式单例和懒汉式单例(双重校验锁和静态内部类),枚举式单例


工厂模式:①封装对象的创建过程(创建过程与业务解耦),②用户只需关心产品的接口,具体产品由工厂决定

简单工厂模式:一个工厂生成多种产品 - 每次新增产品都需修改工厂对象
工厂方法模式:m个工厂生产n种产品 - 简单工厂类的集合,每次新增产品可修改已有工厂类或者新增产出该产品的工厂类
抽象工厂方法:产品簇概念,由接口的实现延申出一个维度,而接口方法延申出另一个维度。
池化技术:控制对象的创建和回收,实现有限多例。


原型模式:通过拷贝原型实例,生成一个新的对象 (java中,多专指实现Cloneable接口对象 - 内存拷贝二进制流)


建造者模式:可选择的组装式创建对象。 ①(无序)零件装配,②顺序加工过程

结构型模式:

代理模式(组合)Proxy对象 + ISubject接口,通过代理对象间接访问被代理对象,使代理对象对被代理对象实现控制(额外功能织入)

动态代理核心:
① 在代理对象方法中,完成被调用方法和参数的信息采集,传递给invoke对象。
② invoke对象完成前后置代码织入
③ invoke对象需调用被代理对象主要业务逻辑方法
JDK Proxy通过反射完成步骤③,而CGLib通过额外的代码,维护了从方法名到具体方法的调用逻辑。


门面模式/外观模式:对于一个子系统,高层模块与其通信均通过一个统一的对象进行,实现封装/隔离,降低模块之间的耦合依赖


装饰器模式(组合)装饰类(Decorator) + 被装饰接口(IComponent),动态地对Component对象的功能进行增强(弱耦合,选择性地装配,避免了继承的弊端


享元模式(池化技术)内部状态(不可变):实现共享,外部状态(可变):实现对象复用


混合模式/整体-部分模式:将对象组合成树形结构以表示“部分-整体”的层次结构,使枝叶节点的使用具有一致性
①简化客户端的使用,②节点可自由增加


适配器模式对象适配器 - (组合)适配器类Adapter + 被适配对象(Adaptee) >> 目标接口Target,完成接口规格转换,使接口不兼容的对象之间可以一起工作


桥接模式(组合)抽象部分角色(Manager) + 实现部分接口(IDriver),将不变部分作为控制维度(抽象部分),将易变部分作为被依赖维度(实现部分),提高系统灵活性 —— 组合复用原则和面向接口编程的实现指导(抽象构建框架,实现扩展细节)

行为型模式:

模板方法模式父类做出行为规划(不变部分),子类实现行为细节(可变部分),子类可以通过钩子方法对行为规划做出一定调整。


策略模式(组合)控制类(Context) + 策略接口(IStrategy),侧重实现类之间可替换,(任务调度分派的职责交由高层模块)
委派模式(组合)委托人(Delegater) + 执行者接口(IExecutor),侧重任务调度分派

PS:多执行者的委派模式,需要委派人对执行者进行选择时:工厂方法模式 + 策略模式 ≈ 委派模式


责任链模式链接调用结构,使请求与处理解耦(只需将请求送入链中,则链中的所有节点均有机会处理该请求)


迭代器模式:集合类型框架的设计指导,应该为集合提供统一的遍历方法且不暴露集合内部的数据结构细节


命令模式:将命令的请求与处理解耦,实现客户端的命令请求参数化


状态模式:状态转换图when(行为,状态)->do(next行为):next状态的实现指导:当前状态决定当前行为,行为执行后又可能导致状态转换


备忘录模式:备份和恢复,存档/回档机制


中介者模式(网状拓扑 -> 星型拓扑)用中介对象来封装对象与对象之间的交互,避免显示依赖,实现松散耦合,使类的改动局限于类本身和中介类


解释器模式:创建一个能解析特定文法规则(词法解析,语法解析,语义解析)的解析器,从而将符合该文法规则的语句转换成对应的处理逻辑 (解释器:用户语句 -> 具体执行逻辑)


观察者模式(发布-订阅模式 or 模型-视图模式)当被观察者(触发器)状态改变时,被观察者(触发器)将事件通知到所有的观察者


访问者模式:(数据结构 - visitor - user)使用visitor封装对数据结构的访问方式,每一个visitor实现子类都对应了一种访问方式

拓展模式

空对象模式:接口存在两种实现(真实对象类和NullObject对象类),使用NullObject替代null值作为返回,避免额外的null检查和空指针异常
[选项模式 - option模式] 一般存在于函数参数化语言,用于灵活设置初始化参数(作用大概等同于构建者模式,但相对灵活)

关键词:

访问封装共性提取降低耦合度限制修改的风险范围提高系统灵活性提高系统易用性多用接口+组合关系(抽象构建框架,实现扩展细节)

源码路径:https://gitee.com/kiqi/design-principles

posted @ 2020-11-18 19:12  祁奇  阅读(139)  评论(0编辑  收藏  举报