|
|
|
@ -0,0 +1,242 @@
|
|
|
|
|
# 设计模式学习
|
|
|
|
|
|
|
|
|
|
## 大纲
|
|
|
|
|
|
|
|
|
|
**概述**
|
|
|
|
|
|
|
|
|
|
**1.如何评价代码的好坏**
|
|
|
|
|
|
|
|
|
|
**2.编程方法论**
|
|
|
|
|
|
|
|
|
|
**3.设计模式分类**
|
|
|
|
|
|
|
|
|
|
**4.六大设计原则**
|
|
|
|
|
|
|
|
|
|
**单一职责**
|
|
|
|
|
|
|
|
|
|
**里氏替换**
|
|
|
|
|
|
|
|
|
|
**依赖倒置**
|
|
|
|
|
|
|
|
|
|
**接口隔离**
|
|
|
|
|
|
|
|
|
|
**迪米特**
|
|
|
|
|
|
|
|
|
|
**开闭**
|
|
|
|
|
|
|
|
|
|
**名词解释**
|
|
|
|
|
|
|
|
|
|
**创建型**
|
|
|
|
|
|
|
|
|
|
**单例模式**
|
|
|
|
|
|
|
|
|
|
**工厂模式**
|
|
|
|
|
|
|
|
|
|
**抽象工厂模式**
|
|
|
|
|
|
|
|
|
|
**建造者模式**
|
|
|
|
|
|
|
|
|
|
**原型模式**
|
|
|
|
|
|
|
|
|
|
**结构型**
|
|
|
|
|
|
|
|
|
|
**代理模式**
|
|
|
|
|
|
|
|
|
|
**适配器模式**
|
|
|
|
|
|
|
|
|
|
**桥接模式**
|
|
|
|
|
|
|
|
|
|
**装饰器模式**
|
|
|
|
|
|
|
|
|
|
**组合模式**
|
|
|
|
|
|
|
|
|
|
**外观模式**
|
|
|
|
|
|
|
|
|
|
**享元模式**
|
|
|
|
|
|
|
|
|
|
**行为型**
|
|
|
|
|
|
|
|
|
|
**观察者模式**
|
|
|
|
|
|
|
|
|
|
**模板模式**
|
|
|
|
|
|
|
|
|
|
**策略模式**
|
|
|
|
|
|
|
|
|
|
**责任链模式**
|
|
|
|
|
|
|
|
|
|
**迭代器模式**
|
|
|
|
|
|
|
|
|
|
**状态模式**
|
|
|
|
|
|
|
|
|
|
**访问者模式**
|
|
|
|
|
|
|
|
|
|
**备忘录模式**
|
|
|
|
|
|
|
|
|
|
**命令模式**
|
|
|
|
|
|
|
|
|
|
**解释器模式**
|
|
|
|
|
|
|
|
|
|
**中介模式**
|
|
|
|
|
|
|
|
|
|
**5.UML类图**
|
|
|
|
|
|
|
|
|
|
## 2023/1/30学习
|
|
|
|
|
|
|
|
|
|
概述
|
|
|
|
|
|
|
|
|
|
1.**如何评价代码的好坏**
|
|
|
|
|
|
|
|
|
|
可扩展 可复用 可读 简洁 可测试 灵活 可维护
|
|
|
|
|
|
|
|
|
|
2.**编程方法论**
|
|
|
|
|
|
|
|
|
|
设计模式 + 设计原则 + 面向对象 + 编程规范 融汇贯通(先实现再考虑其它的)
|
|
|
|
|
|
|
|
|
|
3.**设计模式分类**
|
|
|
|
|
|
|
|
|
|
创建型 行为型 结构型
|
|
|
|
|
|
|
|
|
|
4.**六大设计原则**
|
|
|
|
|
|
|
|
|
|
**单一职责**
|
|
|
|
|
|
|
|
|
|
一个类只负责一个功能
|
|
|
|
|
|
|
|
|
|
**里氏替换**
|
|
|
|
|
|
|
|
|
|
方法参数定义为接口类型,不同的业务传入不同的实现类
|
|
|
|
|
|
|
|
|
|
**依赖倒置**
|
|
|
|
|
|
|
|
|
|
上层不应该依赖下层,如controller 不应该依赖serviceImpl,应该依赖其接口
|
|
|
|
|
|
|
|
|
|
**接口隔离**
|
|
|
|
|
|
|
|
|
|
不同的业务系统,在使用同一个业务对象时(微服务中),应当针对不同的系统设计出最小的依赖接口
|
|
|
|
|
|
|
|
|
|
**迪米特**
|
|
|
|
|
|
|
|
|
|
一个类依赖另一个类,应该依赖其接口
|
|
|
|
|
|
|
|
|
|
**开闭**
|
|
|
|
|
|
|
|
|
|
在扩展新的业务 不能改变原有的业务功能
|
|
|
|
|
|
|
|
|
|
**5.UML类图**
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
**创建型**
|
|
|
|
|
|
|
|
|
|
**单例模式**
|
|
|
|
|
|
|
|
|
|
饿汉式:没有做到懒加载,JVM保证线程安全
|
|
|
|
|
|
|
|
|
|
懒汉式不加锁:懒加载,线程不安全
|
|
|
|
|
|
|
|
|
|
懒汉式加锁:懒加载,线程不安全,锁粒度太大
|
|
|
|
|
|
|
|
|
|
DCL:懒加载,线程不安全
|
|
|
|
|
|
|
|
|
|
静态内部类:懒加载,JVM保证线程安全
|
|
|
|
|
|
|
|
|
|
枚举(最佳)
|
|
|
|
|
|
|
|
|
|
反射机制破坏单例模式 ,解决方案 在构造方法中添加 instance 非空判断
|
|
|
|
|
|
|
|
|
|
序列化破坏单例模式,添加readResolve方法
|
|
|
|
|
|
|
|
|
|
**工厂模式**
|
|
|
|
|
|
|
|
|
|
简单工厂 优点: 象的创建和业务逻辑层分开 缺点:新增产品时需要修改工厂类 不满足ocp
|
|
|
|
|
|
|
|
|
|
工厂方法 优点:在简单工厂的基础上,为每一个产品增加一个工厂,满足ocp 缺点:类爆炸
|
|
|
|
|
|
|
|
|
|
抽象工厂 优点:将产品进行分类,为一类产品创建一个工厂(减少了工厂的创建),
|
|
|
|
|
|
|
|
|
|
**建造者模式**
|
|
|
|
|
|
|
|
|
|
当产品对象非常复杂时,建造者需要分步骤执行,可以类似工厂方法模式
|
|
|
|
|
|
|
|
|
|
**原型模式**
|
|
|
|
|
|
|
|
|
|
根据已有的对象复制出一个新的,有浅克隆和深克隆之分
|
|
|
|
|
|
|
|
|
|
深克隆可以有 Cloneable接口,或者BeanUtils或者SerializationUtils实现
|
|
|
|
|
|
|
|
|
|
**结构型**
|
|
|
|
|
|
|
|
|
|
**代理模式**
|
|
|
|
|
|
|
|
|
|
静态代理 与动态代理
|
|
|
|
|
|
|
|
|
|
区别在于 生成代理类的时机 不同 静态代理在编译时 动态代理在运行时
|
|
|
|
|
|
|
|
|
|
JDK动态代理:调用Proxy.newProxyInstance方法动态创建代理类字节码二进制流,用的是ProxyGenarator技术
|
|
|
|
|
|
|
|
|
|
CGLIB动态代理:调用的是Enhancer第三方ASM框架生成字节码
|
|
|
|
|
|
|
|
|
|
两者对比:
|
|
|
|
|
|
|
|
|
|
生成代理类的技术不同:jdk使用ProxyGenarator生成,cglib使用ASM框架生成
|
|
|
|
|
|
|
|
|
|
生成代理类的数量不同:jdk只生成一个代理类,cglig生成一个代理类和两个索引类(方法名和索引)
|
|
|
|
|
|
|
|
|
|
代理类的增强方式不同:jdk是实现共同的接口,cglib是继承
|
|
|
|
|
|
|
|
|
|
调用方式不用:jdk是反射调用,代理类方法 -> invok() ->反射调用目标类方法,cglib是直接调用 代理类方法 -> intercept->直接调用目标类方法
|
|
|
|
|
|
|
|
|
|
**适配器模式**
|
|
|
|
|
|
|
|
|
|
**桥接模式**
|
|
|
|
|
|
|
|
|
|
指生产一个产品,分多步执行,每一步都有多种选择
|
|
|
|
|
|
|
|
|
|
**装饰器模式**
|
|
|
|
|
|
|
|
|
|
**组合模式**
|
|
|
|
|
|
|
|
|
|
**外观模式**
|
|
|
|
|
|
|
|
|
|
**享元模式**
|
|
|
|
|
|
|
|
|
|
**行为型**
|
|
|
|
|
|
|
|
|
|
**观察者模式**
|
|
|
|
|
|
|
|
|
|
**模板模式**
|
|
|
|
|
|
|
|
|
|
**策略模式**
|
|
|
|
|
|
|
|
|
|
**责任链模式**
|
|
|
|
|
|
|
|
|
|
**迭代器模式**
|
|
|
|
|
|
|
|
|
|
**状态模式**
|
|
|
|
|
|
|
|
|
|
**访问者模式**
|
|
|
|
|
|
|
|
|
|
**备忘录模式**
|
|
|
|
|
|
|
|
|
|
**命令模式**
|
|
|
|
|
|
|
|
|
|
**解释器模式**
|
|
|
|
|
|
|
|
|
|
**中介模式**
|
|
|
|
|
|
|
|
|
|
设计原则总结
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
工厂模式总结
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
建造者模式总结
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
动态代理总结
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|