代理模式概念

  • 实现一个代理类以及它所对应的受代理对象,其他所有类对受代理对象的访问,都由代理对象代为实现。
  • 优点:在目标对象基础之上,可以增加一些额外的功能。
  • 个人认为,这种模式适用于:
    • 你需要使用别人写好的一个类(别人已经打包成 jar 包,你只有 .class 文件),但是有额外功能需要添加,这时候可以通过代理的方式来扩展该类。
    • 当一个类对于不同的调用者提供不同的访问权限时,可以实现不同的代理类来实现。

静态代理

  • 需要实现三个类,受代理对象的抽象类或接口(称为主题类),受代理对象的类(真实主题类),代理对象类,其中受代理对象与代理对象都应继承前面那个抽象类或者实现那个接口。
  • 这个实现比较简单,仅需要实现主题类、真实主题类以及代理对象类。下面展示一下对应的 UML。

  • 缺点:每次新增一个真实主题类时,需要手动增加一个代理类。

动态代理(接口代理)

  • 依赖于 java.lang.reflect 包下的 Proxy 类与 InvocationHandler 接口实现。
  • 先来看新建一个 Proxy 实例的方法
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h) throws IllegalArgumentException
// get a new Proxy Instance
// loader 通过反射机制获取到的受代理对象的类加载器
// interfaces 受代理对象实现的业务接口组(这个动态代理所能代理的方法便是这些业务接口里面实现的方法)
// h Proxy 实例被调用时便会将调用的 Method 对象与参数传给 h 中实现的 invoke 方法
  • 再来看接口 InvocationHandler 的定义

InvocationHandler is the interface implemented by the invocation handler of a proxy instance.

Each proxy instance has an associated invocation handler. When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invoke method of its invocation handler -- Java SE8 API

每一个 Proxy 实例都需要一个 InvocationHandler 接口的实现与其配合工作,当一个 Proxy 的方法被调用,这个方法调用会被编码并将信息发送给 Invocation Handler 里定义的 invoke 方法。下面来看看 invoke 方法。

Object invoke(Object proxy, Method method, Object[] args) throws Throwable// proxy 被调用的 Proxy 实例
// method 调用的方法对象(这个方法应该是 Proxy 实例所实现了的接口里面定义的方法,即上一步参数 interfaces 中定义的方法)
// args 调用时传入的参数
  • 使用上述两个方法,我们便可以实现动态代理,即不需要为新增的受代理对象定义一个代理类,而是可以采用定义一个静态代理工厂类,让其实例化各种各样的代理类。参考代码如下
// ProxyFactory.java
package Proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 静态工厂类,需要实现 InvocationHandler 接口,这样才能够调用 newProxyInstance()
public class ProxyFactory implements InvocationHandler{private Object target;public ProxyFactory(Object target) {this.target = target;}public Object getProxyInstance() {return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), // 运用反射机制获取接口组this); // 该方法三个参数里的 h 恰好就是实现了 InvocationHandler 接口的 this}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.printf("start Proxy the method is %s\n", method);Object aobj = method.invoke(target, args);return aobj;}
}// Subject.java
package Proxy;
// 主题接口的定义
public interface Subject {public void doSomething();
}// RealSubject.java
package Proxy;
// 一个真实主题类
public class RealSubject implements Subject{public RealSubject() {}@Overridepublic void doSomething() {System.out.println("the RealSubject is invoked");}
}// ClientTest.java
package Proxy;
// 客户测试类
public class ClientTest {public static void main(String[] args) {RealSubject target = new RealSubject();ProxyFactory afactory = new ProxyFactory(target); // 生成工厂实例Subject aproxy = (Subject) afactory.getProxyInstance(); // 生成代理实例aproxy.doSomething(); // 通过代理实现业务功能}
}
  • 缺点:真实主题类是依靠接口实现的代理,即需要将业务逻辑写在一个接口里面。

Cglib 代理

  • Cglib 代理是子类代理,即它是在内存中构建一个受代理类的子类,从而实现代理以及功能扩展。

  • 这个实现需要 Cglib jar 包(Spring 核心包内已有),并调用里面设定好的方法即可。这个留到学习 Spring 的时候再填坑。

转载于:https://www.cnblogs.com/Melles/p/10740079.html

Java 设计模式 -- 代理模式相关推荐

  1. java设计模式代理模式_Java中的代理设计模式

    java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...

  2. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  3. Java设计模式-代理模式笔记

    代理模式 0 什么是代理模式 理解方式1 理解方式2 1 静态代理 1.1 代码实现 1.2 方法解读 1.3 优缺点 2 动态代理 2.1 具体实现 2.2 方法解读 2.3 注意 3 Cglib代 ...

  4. 通俗易懂说java设计模式-代理模式

    基本概念 代理模式,和我们在生活中所理解的"代理"思想并没有太大的区别.代理模式的实现需要我们设计一个代理类,在不直接访问被代理对象的前提下,通过代理类实现对被代理对象的间接访问, ...

  5. JAVA设计模式--代理模式(静态)

    目录 一.什么是代理模式 二.静态代理模式的结构 三.静态代理模式应用举例 应用一 应用二 四.代理模式的应用场景 五.静态代理模式的特点 一.什么是代理模式 代理(Proxy)模式为其他对象提供一种 ...

  6. Java设计模式—代理模式

    1. 什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2. 代理模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标 ...

  7. java设计模式-代理模式初探

    根据圣思园的视频,整理的java代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间 ...

  8. JAVA设计模式 - 代理模式

    在对象的一个业务方法完成之后, 有时候我们可能需要去添加一些新的功能(前置校验等). 但我们又不想更改原来的代码 , 代理模式就为我们提供了一种解决方案 . 1 . 代理模式的定义 代理模式就是在不改 ...

  9. Java设计模式——代理模式

    文章目录 1.简介 2.推荐实现案例 3.优缺点 3.1 优点 3.2 缺点 4.应用场景 5.注意事项 6.拓展 6.1 普通代理 6.2 强制代理 6.3 代理类的个性 6.4 动态代理 7.最佳 ...

  10. Java设计模式--代理模式

    1. 代理模式的引入 王大爷借了小李1.5亿,小赖是个无赖横竖就是不还钱,王大爷身子弱讨不回钱就请了讨债公司的小强,最后小强通过一系列**(过于残暴被打码了)的手段帮助王大爷讨回欠款.完事后还帮王大爷 ...

最新文章

  1. API sklearn.neighbors.KNeighborsClassifier
  2. wifi拥挤时防掉线小技巧
  3. BugKuCTF 杂项 猜
  4. oracle Data Modeler 使用教程
  5. 大一的时候我上铺一哥们天天说梦话,一夜,他羞涩的说:“我怀孕了。”我们全体晕倒。...
  6. 用友 无法正确解析服务器,用友T3软件登陆软件时提示:“可能无法正确解析服务器名称或者相应的端口被禁用,请尝试输入服务器的IP地址”?...
  7. python3 beautifulsoup 模块详解_关于beautifulsoup模块的详细介绍
  8. 由已有数组创建新数组:concat()splice()方法
  9. 完全免费软件开发论坛介绍
  10. 交付管理——怎样推动项目验收
  11. 使用MTK的SN writer工具写IMEI的方法
  12. 跨界打劫!中医保健店用一招免费洗车,快速引流进店,月赚20万
  13. position: sticky 详解
  14. 这篇文章能让你明白经验模态分解(EMD)——IMF的物理含义
  15. 神经网络可以解决的问题,人工神经网络通过调整
  16. Flutter 左右菜单联动
  17. 小红书笔记下沉的方法和技巧
  18. 计算机毕业设计——基于HTML电商购物商城项目设计与实现-快购优品 带论文6500字 答辩ppt
  19. h5 实现一键复制到粘贴板 兼容iOS
  20. TPM 2.0规范系列解读——Part 1体系结构第(四)读:TPM架构

热门文章

  1. 10款主流的软件测试工具,你用过吗?
  2. 组件中使用_尚德高效组件全线投入壳牌首个光伏项目中使用
  3. go mysql delete_go 操作mysql、增删改查
  4. linux快速查找文件中所包含的指定字段的个数
  5. linux搭建博客Day1
  6. 九宫怎么排列和使用_别人家连客厅茶几都不要了,你却还在纠结挂画怎么挂
  7. linux硬盘检测工具,linux 系统下磁盘检测工具e2fsck的使用
  8. 模型ks_风控建模 模型指标篇
  9. python 常量池_聊一聊让我蒙蔽一晚上的各种常量池
  10. NCFM识别-Googlenet