
本文共 2620 字,大约阅读时间需要 8 分钟。
23种设计模式 GoF23
提高思维能力、编程能力、设计能力
程序设计更加标准化、工程化,开发效率大大提高
可读性高,可靠性强、可维护性强
一种思维、一种态度、一种进步
要理解思想
设计模式的基本要素
模式名称
问题
解决方案
效果 (优点和缺点)
哪23种?
创建型模式
单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式
结构型模式
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式
行为型模式
模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式
OOP的七大原则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GiKxuCq4-1615135648142)(C:\Users\ThundeRobot\AppData\Roaming\Typora\typora-user-images\image-20210307181638349.png)]
工厂模式
详细分类
简单工厂模式
工厂方法模式
抽象工厂模式
OOP七大原则
开闭原则:一个软件的实体应当对扩展开发,对修改关闭
依赖倒转原则:要针对接口编程,不要针对实现编程
迪米特法则:只与你直接的朋友通信,而避免和陌生人通信
核心本质
实例化对象不适用new,用工厂方法代替
将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sbiWQqCd-1615135648144)(C:\Users\ThundeRobot\AppData\Roaming\Typora\typora-user-images\image-20210307183421443.png)]
建造者模式
代理模式 proxy
为什么要学习代理模式? 因为这是SpringAOP的底层 【SpringAOP和SpringMVC】
静态代理
角色分析:
- 抽象角色:一般会使用接口或者抽象类来解决 共同完成的事情
- 真实角色:被代理的角色
- 代理角色:代理真实角色,代理真实角色后,一般会做一些附属操作
- 客户:访问代理对象的人
代理角色的好处:
- 让真实角色的操作更加的纯粹!不用去关注一些公共的业务
- 公共业务就交给代理角色!实现了业务的分工
- 公共业务发生扩展时,方便集中管理!
缺点
- 一个真实角色,就会产生一个代理角色,开发效率会变低~
加深理解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AwJKj0cn-1615135648145)(C:\Users\ThundeRobot\AppData\Roaming\Typora\typora-user-images\image-20210307202427854.png)]
动态代理
- 动态代理角色和静态代理角色一样
- 动态代理的代理类是动态生成的,不是我们直接写好的!
- 动态代理分为两大类: 基于接口的动态代理 、 基于类的动态代理
- 基于接口 ---- JDK动态代理【我们使用】
- 基于类: cglib
- java字节码实现: javassist 比较流行,但是不是tomcat
需要了解两个类
Proxy(代理)
有一个静态方法,可以创建一个实例的动态代理
java.lang.reflect.InvocationHandler(调用处理程序)
通过代理实例 调用处理程序的一个接口
// 可以当作一个工具类package com.realguo.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class MyInvocationHandler implements InvocationHandler { private Object target; // 设置被代理的接口 public void setTarget(Object target) { this.target = target; } // 生成代理类 对象实例 public Object getProxy(){ return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } // 处理代理实例,并返回结果 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 动态代理的本质,通过使用反射机制实现!!! log(method.getName()); Object result = method.invoke(target, args); return result; } void log(String name){ System.out.println("[" + name + "]"); }}
理解
Proxy.newProxyInstance(类加载器,要实现的代理接口,InvocationHandler调用处理程序)
返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。
InvocationHandler 是 代理实例的调用处理程序 实现 的接口 ,里面有调用处理程序
动态代理的本质:
是通过反射来实现的
动态代理的好处:
- 让真实角色的操作更加的纯粹!不用去关注一些公共的业务
- 公共业务就交给代理角色!实现了业务的分工
- 公共业务发生扩展时,方便集中管理!
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务
- 一个动态代理类,可以代理多个类,只要实现了同一个接口即可
单例模式
饿汉模式
懒汉模式
双重锁
发表评论
最新留言
关于作者
