文章目录

  • 代理模式真得这么简单
    • 代理模式类图
    • 静态代理实例
    • 动态代理实例
      • java动态代理类图
      • 案例
    • CGLIB代理实例
    • CGLIB原理解析

代理模式真得这么简单

代理模式的定义:为另一个对象提供一个替身或占位符以控制对这个对象的访问

代理模式类图

简单描述就是真实对象RealSubject,和代理对象Proxy实现同一个接口Subject,并且代理对象Proxy持有真实对象的引用

静态代理实例

GumballMachine,作为真实对象

//糖果机,拥有两个属性,位置和糖果数量
public class GumballMachine{String location;int count;public GumballMachine(String location, int count){this.location = location;]this.count = count;}public String getLocation(){return location;}public int getCount(){;return count;}
}

GumballMonitor,作为代理对象,控制对真实对象的访问

public class GumballMonitor{GumballMachine machine;public GumballMonitor(GumballMachine machine){this.machine = machine;}public void report() {System.out.println("Gumball Machine " + machine.getLocation());System.out.println("Current inventory: " + machine.getCount() + "gumballs");}
}

Main函数

public class GumballMachineTestDrive{public static void main(String args[]) {GumballMachine machine = new GumballMachine("ChangJinag", 20);GumballMonitor monitor = new GumballMonitor(machine);monitor.report();}
}

动态代理实例

java动态代理工具,在java.lang.reflect包里,使用起来其实也简单,下面用一个实例简单介绍一下java动态代理的具体用法

java动态代理类图

真实对象RealSubject,和代理对象,Proxy,实现共同接口,Proxy对象持有InvocationHanlder引用,InvocationHandler同时持有真实对象的引用。

所以对代理方法的访问,会转接到InvocationHandler类的invoke方法上,invoke方法又会主动调用RealSubect相应方法。

案例

有一个Person类,除了维护个人信息之外,还拥有一个HotOrNotRating属性(评分属性)

此属性本人不能修改,只能由他人进行修改。所以需要控制对此属性的访问。

Person和其代理共同实现的接口类

interface PersonBean{void setName(String name);void setAge(int age);void setHotOrNotRating(int HotOrNotRating);String getName();int getAge();int getHotOrNotRating();
}

Person类

class Person implements PersonBean{String name;int age;int HotOrNotRating;Person(){}Person(String name, int age, int HotOrNotRating){this.name = name; this.age = age; this.HotOrNotRating = HotOrNotRating;}public void setName(String name){this.name = name;}public void setAge(int age){this.age = age;}public void setHotOrNotRating(int HotOrNotRating){this.HotOrNotRating = HotOrNotRating;}public String getName() {return name;}public int getAge() {return age;}public int getHotOrNotRating() {return HotOrNotRating;}
}

OwnerInvocationHandler类

class OwnerInvocationHandler implements InvocationHandler{PersonBean person;public OwnerInvocationHandler(PersonBean person) {this.person = person;}public Object invoke(Object proxy, Method method, Object[]args) throws IllegalAccessException{try{if(method.getName().startsWith("set")){if(method.getName().startsWith("setHotOrNotRating")) throw new IllegalAccessException();else return method.invoke(person, args);}else return method.invoke(person,args);}catch(InvocationTargetException e) {e.printStackTrace();}return null;}
}

Main类

public class Main{//动态生成代理public static PersonBean getOwnerProxy(PersonBean person) {return (PersonBean) Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(),new OwnerInvocationHandler(person));}public static void main(String args[]){PersonBean person = new Person("Bob", 24, 90);PersonBean ownerProxy = getOwnerProxy(person);try{ownerProxy.setHotOrNotRating(10);}catch(Exception e) {System.out.println("Owner can't modify the field of HotOrNotRating");}}
}

CGLIB代理实例

person类:与上同

实现MethodInterceptor接口,方法调用均会被intercept方法拦截

/**
sub:生成的代理对象
method:真实对象原方法
objectArr:方法参数列表
methodProxy:代理方法
**/
class MethodInterceptorImp implements MethodInterceptor{@Overridepublic Object intercept(Object sub, Method method, Object[] objectArr, MethodProxy methodProxy)throws Throwable {System.out.println("代理Start");Object object = methodProxy.invokeSuper(sub, objectArr);System.out.println("代理End");return object;}
}

Main方法

public class Main {public static void main(String args[]) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(Person.class);enhancer.setCallback(new MethodInterceptorImp());Person proxy = (Person)enhancer.create();proxy.setName("zhouyu");System.out.println(proxy.getName());}
}
//代理Start
//代理End
//代理Start
//代理End
//zhouyu

CGLIB原理解析

JDK动态代理无法代理非接口

代理模式真得这么简单相关推荐

  1. 【设计模式】—-(12)代理模式(结构型)

    这篇文章挺有意思的,是男人应该都能理解吧.(捂嘴:)) 代理模式理解应该很简单,就是现实中的中介,相信大家都租过房子,撸主上学那会其实就很鄙视中介,看其他同学都找中介很快搞定房子,而露珠呢,宁可自己去 ...

  2. 代理模式(Proxy)简介

    代理模式相对来讲比较简单和容易理解. 一, 代理模式(Proxy)的定义 教材里定义很简单: 所谓代理模式, 就是为其他对象提供一种代理控制对这个对象的访问. 上面出现了3个名词: 1.其他对象 2. ...

  3. C++设计模式--代理模式(Proxy)

    前言 C++相对其他编程语言来说算是比较难的了,相关知识点非常多,并且有些概念理解起来比较困难,对于初学者来说可能会感觉到非常痛苦.随着项目难度的升级,需要不断地优化框架从而使整个结构更具有扩展性,那 ...

  4. JAVA设计模式之抽象工厂模式和代理模式

    目录 一.抽象工厂模式 1.1.模式的定义与特点 1.2.模式的结构 二.代理模式 2.1代理模式的定义与特点 2.2代理模式的结构与实现 一.抽象工厂模式 1.1.模式的定义与特点 抽象工厂(Abs ...

  5. Java 设计模式(十三):代理模式

    参考链接:代理模式-Proxy Pattern 近年来,代购已逐步成为电子商务的一个重要分支.代购简单来说就是找人帮忙购买所需要的商品,代购网站就是其中一种产物,它为消费者提供在线的代购服务,如果看中 ...

  6. Java~Java代理模式

    代理模式: 设计模式就是一套被反复使用.多数人知晓的.经过 分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人 理解并且保证代码可靠性.代理模式就是其中一种. 给某一个对 ...

  7. 23种设计模式之代理模式

    文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...

  8. 设计模式之一代理模式

    代理模式(代理设计模式) 代理模式的定义与特点 代理模式的结构与实现 代理模式(代理设计模式) 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代 ...

  9. C#设计模式之代理模式(一)

    代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口.根据代理模式 ...

最新文章

  1. win7如何设置wifi热点_xp系统怎么设置无线网络热点(电脑设置wifi热点步骤)
  2. 慕课网初识python_初识Python笔记
  3. LeetCode-数组-54. 螺旋矩阵
  4. 使用Git工具下载android源码---带步骤
  5. MySql 获取表的Comment
  6. js如何查看元素类型
  7. python和sql_Python和SQL 2017的强大功能
  8. Python——assert(断言函数)
  9. C# 中的readonly属性
  10. linux git 搭建 debian,基于Debian Linux搭建Git服务器
  11. 提交注册信息到数据库中
  12. 【LeetCode-13】-罗马数字
  13. 用Python告诉你深圳房租有多高,做程序员真的能买得起嘛
  14. 怎么用wps将pdf转换成html,如何将PDF格式的文件转换成HTML格式
  15. 2017网易雷火实习生招聘编程题
  16. OpenCV实现单目摄像头对图像目标测距
  17. Linux内核源码组织结构
  18. [HNOI2005]狡猾的商人(差分约束)
  19. 移动端微信接收到CAD图纸,如何打开?
  20. 成功解决500 : Internal Server Error问题

热门文章

  1. 乐忧商城项目总结-1
  2. JMeter学习-005-JMeter 配置元件实例之 - CSV Data Set Config 参数化配置
  3. 19.系统知识-数字证书
  4. 大厦设计师 -- 建造者模式 (Builder Pattern) 介绍 使用案例场景分析 优缺点 及代码演示
  5. 期权交易,这两个要点一定要掌握!
  6. 数据库系统工程师考试历年试题分析与解答
  7. ts 打开sourcemap_使用ts-node和vsc来调试TypeScript代码
  8. 深入浅出 TypeScript
  9. zabbix系列:解决zabbix模板不能重复链接到其它模板, 即使透过其它模板
  10. tl494cn逆变器电路图_TL494制作的400W大功率稳压逆变器电路图