## 设计模式(最佳实践) - 目标: 代码复用, 可读性, 可扩展性, 可靠性 ==> 高内聚, 低耦合 - 原则: * 开闭原则: 对扩展开放(提供方), 对修改关闭(使用方) * 单一职责: 一个类只负责一项功能 * 接口隔离: 客户端依赖的接口应该是最小接口 * 依赖倒转: 即面向接口编程 * 里式替换: 继承时子类尽量不要重写父类的方法, 以便引用父类的地方可以透明的使用子类 * 迪米特法则: 最少知道原则, 只与直接朋友通信(成员变量,方法参数及返回值) * 合成复用原则: 尽量使用合成/聚合的方式, 而不是使用继承 - 展现: 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并增强多线程处理能力