二十三种设计模式(第十二种)-----代理模式(Proxy)

尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=11487053970269878470

  1. 为对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上增强额外的功能操作,即扩展目标对象的功能。
  2. 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象
  3. 代理模式有不同的形式,主要有三种代理模式、静态代理、动态代理(JDK代理、接口代理)和Cglib代理(可以在内存动态的创建对象,而不需要实现接口,他属于动态代理的范畴)

静态代理

静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者继承相同的父类

实例

  1. 定义一个接口:ITeacherDao
  2. 目标对象TeacherDao实现接口ITeacherDao
  3. 使用静态代理方式,就需要在代理对象TearcherDaoProxy中也实现ITeacherDao
  4. 调用的时候通过调用代理对象的方法来调用目标对象
  5. 代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法

类图

代码

1.接口

public interface ITeacherDao {//授课void teach();
}

2.目标对象(被代理对象)

public class TeacherDao implements ITeacherDao {@Overridepublic void teach() {System.out.println("老师授课中...");}
}

3.代理对象

public class TeacherDaoProxy implements ITeacherDao {private ITeacherDao target;public TeacherDaoProxy(ITeacherDao target) {this.target = target;}@Overridepublic void teach() {System.out.println("代理开始...完成某些操作");target.teach();System.out.println("代理结束...");}
}

4.客户端调用

public class Client {public static void main(String[] args) {//创建目标对象ITeacherDao teacherDao = new TeacherDao();//创建代理对象ITeacherDao teacherDaoProxy = new TeacherDaoProxy(teacherDao);//通过代理对象 执行方法teacherDaoProxy.teach();}
}

JDK动态代理

  1. 代理对象,不需要实现接口,带是目标对象要实现接口,否则不能用动态代理
  2. 代理对象的生成,是利用JDK的API,动态代理在内存中构建代理对象
  3. 动态代理也叫做JDK代理,接口代理

类图

代码

1.接口

public interface ITeacherDao {//授课方法void teach();
}

2.被代理类

public class TeacherDao implements ITeacherDao {@Overridepublic void teach() {System.out.println("老师正在授课...");}
}

3.代理工厂

public class ProxyFactory {//维护一个目标对象private Object target;//构造器public ProxyFactory(Object target) {this.target = target;}public Object getProxyInstance(){/*public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)ClassLoader loader:指定当前目标对象使用的类加载器,获取类加载器的方法固定Class<?>[] interfaces:目标对象实现的接口类型,使用泛型方法确定类型InvocationHandler h:事情处理,执行目标对象的方法时,会触发事情处理器方法,会把当前执行的目标对象方法作为参数传入*/return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("JDK代理开始~~");//反射机制调用目标对象的方法return method.invoke(target,args);}});}
}

4.客户端

public static void main(String[] args) {//创建被代理对象ITeacherDao target = new TeacherDao();//给目标对象创建代理对象ITeacherDao proxyInstance = (ITeacherDao) new ProxyFactory(target).getProxyInstance();//proxyInstacne=class com.sun.proxy.$Proxy内存中动态生成了代理对象System.out.println("proxyInstacne=" + proxyInstance.getClass());//通过代理对象,调用目标对象的方法proxyInstance.teach();
}

Cglib动态代理

  1. 静态代理和JDK代理模式都要求目标对象是实现一个接口,但有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理
  2. Cglib代理也叫做子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展
  3. Cglib是一个高性能的代码生成包,它可以在运行期扩展java类与实现java接口,它广泛的被许多AOP的框架使用,例如SpringAOP,实现方法的拦截
  4. 在AOP编程中如何选择代理模式
    1. 目标对象需要实现接口,用JDK代理
    2. 目标对象不需要实现接口,用Cglib代理
  5. Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的类
  6. 目标对象的方法如果为fianl/staic,那么就不会被拦截,即不会执行目标对象额外的业务方法

类图

代码

1.依赖jar包

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency><dependency><groupId>org.ow2.asm</groupId><artifactId>asm</artifactId><version>8.0.1</version>
</dependency>

2.被代理类

public class TeacherDao {public void teach(){System.out.println("老师授课中,我是cglib代理,不需要实现接口");}
}

3.代理工厂

public class ProxyFactory implements MethodInterceptor {//维护一个目标对象private Object target;//构造器,传入一个被代理对象public ProxyFactory(Object target) {this.target = target;}//返回一个代理对象:是target对象的代理对象public Object getProxyInstance(){//1.创建一个工具类Enhancer enhancer = new Enhancer();//2.设置父类enhancer.setSuperclass(target.getClass());//3.设置回调函数enhancer.setCallback(this);//4.创建子类对象,即代理对象return enhancer.create();}//重写intercept方法,会调用目标对象的方法@Overridepublic Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("Cglib代理模式~~开始");return method.invoke(target, args);}
}

4.客户端
public static void main(String[] args) {
//创建目标对象
TeacherDao teacherDao = new TeacherDao();
//通过代理工厂获取代理对象
TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(teacherDao).getProxyInstance();
//使用代理对象执行方法
proxyInstance.teach();
}

二十三种设计模式(第十二种)-----代理模式(Proxy)相关推荐

  1. 23种设计模式(十四)模板方法模式(阁瑞钛伦特软件-九耶实训)

    常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法.抽象工厂.单例.建造者.原型 结构型模式7种:适配器.代理.桥接.装饰者.外观.享元.组合 行为型模式11种:模板方法.解释器. ...

  2. 23种设计模式(6):代理模式

    先看一个例子,是有关于打游戏杀怪兽的. //先定义一个游戏者接口 public interface IGamePlayer {//登陆游戏public void login(String user, ...

  3. Java23种设计模式【7】----》代理模式(Proxy patern)

    一.生活中的场景 代理公司,经纪人,中介 二.Java程序中的场景 三.核心作用 举例:歌手和经纪人 客户需要歌手来唱歌,不找歌手,而是找歌手的经纪人. 经纪人:负责面谈.合同起草.签字.收预付款.安 ...

  4. 第二部分:二十三种设计模式解读——什么是工厂方法模式

    二十三种设计模式解读--什么是工厂方法模式 author:陈镇坤27 日期:2022年2月10日 修改日期:2022年6月23日 文章目录 二十三种设计模式解读--什么是工厂方法模式 一.工厂方法模式 ...

  5. 23种设计模式-个人笔记(二)

    目录 五.23 种设计模式 1.单例模式 1.1.单例模式的定义与特点 1.2.单例模式的优点和缺点 1.3.单例模式的应用场景 1.4.单例模式的结构与实现 1.5.八种方式详解 1.6.单例模式在 ...

  6. 23种设计模式:(二)结构型模式

    根据北京尚学堂的视频所学习 结构型模式: 核心作用:是从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题. 分类: 适配器模式.代理模式.桥接模式. 装饰模式.组合模式.外观模式. ...

  7. (原创)无废话C#设计模式之十二:Bridge

    无废话C#设计模式之十二:Bridge 意图 将抽象部分与实现部分分离,使它们都可以独立的变化. 场景 还是说我们要做的网络游戏,多个场景需要扩充的问题我们已经采用了创建型模式来解决.现在的问题就是, ...

  8. Java设计模式(十二) 策略模式

    策略模式介绍 策略模式定义 策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换.客户端可以自行决定使用哪种算法. 策略模式类图 策略模 ...

  9. 设计模式(十二)—— 享元模式

    设计模式(十二)-- 享元模式 定义 结构 案例实现 优缺点和使用场景 JDK源码解析 定义 运用共享技术来有效地支持大量细粒度对象的复用.它通过共享已经存在的对象来大幅度减少需要创建的对象数量.避免 ...

最新文章

  1. MySQL 数据库常用命令—insert delete update select
  2. junit 测试遇上java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing 错误
  3. 使用百度UMeditor富文本编辑器,修改自定义图片上传,修改源码
  4. 网页图表控件Highcharts如何详细设置参数
  5. java如何算log_用java代码计算Log(a)b
  6. spring---aop(10)---Spring AOP中AspectJ
  7. Linux网络子系统中协议栈的入口处理
  8. Lottie - 实现 AE 动效(Bodymovin)
  9. 天勤数据结构顺序表算法操作含完整测试
  10. 监控系统中的几种服务器,监控系统各种服务器
  11. 怎么查找键盘注册表键值_C程序查找通过键盘输入的数字列表的平均值
  12. Verilog语法误区总结
  13. 换你来,你会如何设计微信朋友圈?
  14. c程序-RGB转十六进制
  15. Mac计时器找不到怎么解决
  16. mt4双线macd_实用MACD“三板斧”,你值得拥有(建议收藏)
  17. 阿里数据仓库架构与模型设计
  18. 发挥数字化平台优势,电子元器件采购商城系统助力企业改变固有低效流程
  19. Linux下搭建ESP-IDF 开发环境教程,适合ESP32/S2/C3/S3系列模组二次开发
  20. vuex是干什么的?

热门文章

  1. Windows漏洞:MS08-067
  2. 电脑蓝屏critical_process_died,重装win10遇到的问题
  3. 使用超终端连接Cisco 2950交换机步骤,通过console口
  4. 【Web Design The Missing Link】Chatty APIs
  5. NVIDIA 第七届 SkyHackathon(一)比赛开发环境部署
  6. mac安装golang,编写第一个go程序
  7. 洛奇服务器维护,《洛奇Mabinogi》官方网站
  8. QT简单入门程序——实现可修改用户信息界面
  9. 三星“掌门人”李在镕身在看守所 但仍“遥控”三星
  10. 0基础自学软件测试的渠道你知道哪些?