设计原则与设计模式(总览)
六大设计原则
| 开闭原则(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模式] 一般存在于函数参数化语言,用于灵活设置初始化参数(作用大概等同于构建者模式,但相对灵活)
关键词:
访问封装、共性提取、降低耦合度、限制修改的风险范围、提高系统灵活性、提高系统易用性、多用接口+组合关系(抽象构建框架,实现扩展细节)
欢迎疑问、期待评论、感谢指点 -- kiqi,愿同您为友
-- 星河有灿灿,愿与之辉