代理模式:
- 静态代理
- 动态代理
生活场景:
- 租房中介:中介和你
- 火车票黄牛:黄牛和你
- 媒人:媒婆和你
- 明星经纪人:经纪人和明星
- 刘德华要开演唱会(长沙)、准备工作和善后工作
动态代理:
- JDK自带动态代理:基于接口,cglib.jar (全称 Code Generation Library 代码生成库),asm.jar(全称 assembly,装配)
- Cglib动态代理:基于继承,Proxy,InvocationHandler
特点:
- 执行者、被代理人
- 对于被代理人来说,这件事情是一定要做的,但是我自己又不想做或者没有时间做,找代理。
- 需要获取到被代理的人个人资料。
总结:
做了一件什么事情呢?
字节码重组
可以做一件什么事情?
可以在每一个方法调用之前加一些代码,在方法调用之后再加一些代码
AOP:
事务代理(声明式事务,哪个方法需要加事务,哪个方法不需要加事务)
日志监听
工厂模式:
1、隐藏复杂的逻辑处理过程,只关心执行结果(new对象)
简单工厂、工厂方法、抽象工厂
单例模式:
饿汉式,懒汉式,注册登记式,静态内部类,枚举式等
生活场景:
- 配置文件:如果不是单例(针对于某一种功能的配置)
- (两个配置文件中的内容一样的,则有一个是浪费的
如果是不一样的,我们就不知道以哪个为准了) - 直接上级领导:(对于你来说,如果有多个领导,你到底听谁的? 选择恐惧症)
- 日历:(不严谨)在中国,是有两种日历同时存在的阴历(农历,一般用于指导农业生产,二十四节气)和阳历(公历,一般用于国际交流、企事业单位的工作指导)(在万千世界中,即使是一片小小的树叶,他们都是长得不一样的)
- 注册登记主要是在spring源码有提现,singleton bean的管理
特点:
1、保证从系统启动到系统终止,全过程只会产生一个实例。
2、当我们在应用中遇到功能性冲突的时候,需要使用单例模式。
委派模式:
What:两个角色,受托人,委托人(社会上是平等关系)
公司里面:项目经理,普通员工(法律上平等的,工作的关系,各自的职责会不一样)
干活是我的,功劳是你的(最重要的特点)
项目经理(委托人):主要职责是安排任务
普通员工(受托人):执行任务
特点:
- 类似于中介的功能(委托机制)
- 持有被委托人的引用。
- 不关心过程,只关心结果。
Why? 主要目的就是隐藏具体实现逻辑
IOC 容器中,有一个 Register 的东西(为了告诉我们的容器,在这个类被初始化的过程中,需要做很多
不同的逻辑处理,需要实现多个任务执行者,分别实现各自的功能)
保证结果的多样性,对于用户来是只有一种方法
策略模式:
过程不同,但结果一样。
原型模式:
数据内容完全一样,但实例不同。
模板 模式:
执行流程固定,但中间有些步骤有细微差别。
spring、mybatis、dubbo源码大量使用到这个设计模式
以上是一些总结,后期会把伪代码贴上来