## 设计模式(最佳实践)
- 目标: 代码复用, 可读性, 可扩展性, 可靠性 ==> 高内聚, 低耦合
- 原则:
* 开闭原则: 对扩展开放(提供方), 对修改关闭(使用方)
* 单一职责: 一个类只负责一项功能
* 接口隔离: 客户端依赖的接口应该是最小接口
* 依赖倒转: 即面向接口编程
* 里式替换: 继承时子类尽量不要重写父类的方法, 以便引用父类的地方可以透明的使用子类
* 迪米特法则: 最少知道原则, 只与直接朋友通信(成员变量,方法参数及返回值)
* 合成复用原则: 尽量使用合成/聚合的方式, 而不是使用继承
- 展现: UML类图
- 模式
* 创建型
- 单例模式: 饿汉(Runtime), 懒汉(双重检查锁), 静态内部类, 枚举
- 原型模式: 克隆(浅/深), 序列化与反序列化(ObjectStream/JSON字符串)
- 工厂模式: 将实例化对象的代码提取出来, 放在一个类中统一管理和维护(Calendar)
- 建造者模式: 将复杂对象的建造过程抽象出来,用户指定对象的类型和内容就可以构建他们. xxxBuilder, 控制创建的过程 (StringBuilder)
* 结构型
- 适配器模式
* 类适配器(继承原类并实现目标接口)
* 对象适配器(持有原类并实现目标接口)
* 接口适配器(对所有接口进行空实现)
> 示例: SpringMVC里面的HandlerApater. 编写一个接口我们最常用的@RequestMapping里面一个方法对应一个url,
其实还有很多种, 比如Servlet接口(service方法), Controller接口(handleRequest方法), Spring5新加入的HandlerFunction接口(handle方法).
每一种都可以通过对应的适配器转换为统一的handle方法
- 桥接模式: 多个维度变化时使用组合关系替代继承关系, 避免类爆炸
> 示例: 图形形状, 图形颜色; 两个独立的类层次, 形状和颜色之间的桥梁
> 示例: 消息系统, 维度1: 即可/延迟, 维度2: 短信/邮件/微信
> 示例: 转账系统, 维度1: 网上/柜台/AMT, 维度2: 普通/银卡/金卡
- 装饰者模式: 持有你并增强你, 动态的将新功能附加到对象上
> 示例: IO流, BufferInputStream(FileInputStream)
- 组合模式: 树形结构的整体和部分具有一致性访问
- 外观模式: 门面模式(Facade), 提供访问特定子系统功能的便捷方式
> 示例: 维护一个遗留的大型系统时, 可以为新系统开发一个Facade类, 提供简单清晰的接口
- 享元模式: 运用共享技术有效的支持大量细粒度的对象; 内部状态和外部状态
> 示例1: 池技术. 比如数据库连接池, String常量池
> 示例2: 围棋的棋子(内部状态: 黑色/白色, 外部状态: 位置), 棋子对象只需要两个实例即可
> 示例3: IntegerCache
- 代理模式: 提供一个替身, 通过代理对象访问目标对象, 便于增强额外的功能
* 静态代理
* 动态代理(Jdk, Cglib)
* 变体: 防火墙代理, 缓存代理, 远程代理
* 行为型
- 模板方法模式: 定义抽象操作(算法)的骨架, 子类重写方法实现
- 命令模式: 将动作的请求者 和 动作的执行者解耦出来
* 示例: 将军(命令发布者), 士兵(执行者), 命令(连接将军和士兵)
- 访问者模式: 将数据结构与操作解耦, 在被访问的类里面添加一个对外提供访问者的接口
* 示例: SQL语法解析器
- 迭代器模式: 提供一种遍历集合元素的统一接口, 用一致的方法遍历集合元素
- 观察者模式: Subject注册/移除/通知 (Observable)
- 中介者模式: 用一个中介对象来封装一系列对象交互
* 示例: MVC里面的C就是Model和View的中介者
- 备忘录模式: 记录一个对象的某种状态, 当需要回退时可以从备忘录中恢复
- 解释器模式: 词法分析器, 语法分析器都可以看做解释器
* 原理类图: Context, AbstractExpression (TermialExpression/NonTerminalException)
- 状态模式
- 策略模式
- 职责链模式
- 实例: 计算引擎
* 工厂模式: SqlEngineFactory, 最早设计直接new, 后来添加动态模型,静态模型, 预处理功能, SQL引擎个数等, 为了简化创建SqlEngine对象采用了工厂模式
* 装饰者模式: MultiSqlEngine持有SqlEngine并增强多线程处理能力