1.1.4 设计模式总结
-
不要生搬硬套 , 根据业务场景选择
-
不要把简单的事情复杂化 , 设计模式是用来解决复杂问题 , 把复杂的问题编的简单
-
十种设计模式归纳
-
工厂模式 ( Factory )
- 只对结果负责 , 不管过程
- 原始社会—>农耕社会—>小作坊—>工厂—>流水线生产
- Spring : BeanFactory , FactoryBean
-
单例模式 ( Singleton )
- 保证独一无二
- 为了提高资源重复利用 , 通过技术手段保证在整个系统运行阶段 , 只有一个实例
- Spring 中最常用的 : 注册登记式
- 效率性能最高的 : 懒汉式内部类实现
-
原型模式 ( Prototype )
-
深度克隆
-
Spring中的对象原型 , 主要是为了配置信息能够被重复使用 , 而且互不干扰
<bean scope="prototype"> <list></list> </bean>
-
技术手段 : 实现 cloneable 重写 clone 方法 , 字节码操作
-
-
适配器模式 ( Adapter ) : 转换头 ( 兼容 , 转换 )
-
装饰器模式 ( Decorator )
- 需要包装 , 但不改变本质 ( 同宗同源 , 扩展 , 覆盖 )
- 特殊的 Delegate 与 Adapter 的结合
-
代理模式 ( Proxy )
- 专人办专事
- 完成一件事情 , 代理只参与某一部分的功能
- 技术手段 : JDK Proxy ( 实现接口 ) , Cglib ( 继承 ) , Aspectj ( Spring ) , asm ( Spring )
-
观察者模式 ( Observer )
- 完成后通知
- 针对目标对象的一举一动 , 要得到一个反馈
- Spring : Monitor , Observer , Listener ( 通常会结合动态代理 )
-
策略模式 ( Strategy )
- 只要达到目的就行
- 将一些固定算法统一起来
- 特点 : 巧妙的避免了逻辑判断语句
-
模板模式 ( Template )
- 流程标准化 , 原料自己加
- 流程固定 , 某一个环节有差异
-
委派模式 ( Delegate )
- 分发工作
- Proxy 的特殊情况 , 全权代理
-
1.1.5 编程思想总结
- AOP : Aspect Oriented Programming ( 面向切面编程 )
- Dynamic Proxy 是 AOP 的一种技术实现手段
- 找出多个类中有一定规律的代码 , 开发时拆开 , 运行时合并 , 即面向规则编程
- 多个不相干 ( 规则统一 ) 的切面组合成一个新的产品
- 制定一个切面 , 就制定了一个规则
- 事务代理 : 加在 service 层的增 , 删 , 改
- expression : 切面表达式
- 增强功能 , 解耦 , 专人做专事
- 确定规则
- OOP : Object Oriented Programming ( 面向对象编程 )
- 一切皆对象
- 用代码去描述生活
- 注重事物之间的联系 , 面向过程是关注技术细节和对象
- 封装 , 继承 , 多态
- 程序员的毛病 : 接到需求就开始做 , 不符合 OOP 思想 , 要先理清楚需求之间的关系
- BOP : Bean Oriented Programming ( 面向 Bean 编程 )
- 面向 Bean ( 普通的 java 类 ) 设计程序
- 一切从 Bean 开始
- Spring 提出的编程思想 , 避免一直 new 对象 ( 配置 Hibernate ORM ) , Bean 与 Bean 之间的关系 , 不希望每次人为的重复管理 , 由程序来实现自动管理
- IOC : Inversion Of Control ( 控制反转 )
- 由 BOP 出现才出现了 IOC , 解决 Bean 管理问题
- 创建对象的控制权 ( new ) 反转
- 没有 BOP 与 IOC : 谁使用谁控制
- 有 BOP 与 IOC : Spring 控制管理
- 创建出来后的对象需要统一管理 , 所以才有的 IOC 容器 ( Map )
- DI/DL : Dependency Injection ( 依赖注入 ) /Dependency Lookup ( 依赖查找 )
- 由 BOP , IOC 后才出现了 DI/DL , 解决对象动态赋值问题 ( 采用反射动态调用getter , setter )
- Spring 不仅保存自己创建的对象 , 并且保存对象与对象之间的关系
- 注入即赋值 , 主要三种方式 : 构造方法 , set 方法 , 直接赋值
- 先理清关系再赋值
- Spring 加载步骤
- 定位
- 载入
- 注册
- 确定是否初始化 Spring