设计模式之代理模式
admin
2024-01-25 07:47:20
0

代理模式

代理模式有动态代理和静态代理:静态代理模式中代理类是自己已经定理好的,在程序运行前就已经编译好了,然而动态代理,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。*相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法* 比如说,想要在每个代理的方法前都加上一个处理方法:

JDK和CGLIB的区别

JDK动态代理只能对实现了接口的类生成代理,而不能针对类,使用的是Java反射技术实现,不需要第三方库的支持,生成比较高效。

CGLIB主要是针对一个类生成子类,覆盖其中的方法,是一种继承,并且需要第三方库asm字节码框架来支持。

静态代理

1.确定创建接口具体行为

/***  确定具体得行为接口* */
public interface Person {// 上交班费void giveMoney();

2.被代理对象 Student 实现接口,实现接口的具体行为的方法。

/*** 被代理类*/
public class Student implements Person{@Overridepublic void giveMoney() {System.out.println("学生上交班费....");}
}

3.代理对象,因为代理对象需要去代理被代理对象,所以代理对象必须同样实现被代理对象类的接口。代理对象需要完成委托类预处理消息,消息过滤、转发,所以他必须得持有一个被代理对象,可以是继承或者是关联。

/*** 学生的代理类  实现消息的委托、转发*/
public class StudentsProxy implements Person{// 消息的委托必须要交给被代理类,所以得关联一个被代理类private Student student;// 只会代理学生类public StudentsProxy(Person student){if (student.getClass() == Student.class){this.student = (Student) student;}}// 代替上交班费 调用被代理学生得上交班费行为@Overridepublic void giveMoney() {// 代理类增加其他前置逻辑System.out.println("由我给你张三代缴班费吧。。。。。");student.giveMoney();}
}

4.测试

public class ProxyTest {public static void main(String[] args) {// 创建被代理类Student zhangSan = new Student();//  创建代理类并且代理张三上交班费Person studentsProxy  = new StudentsProxy(zhangSan);// 这样上缴班费就交给了学生得代理类了 用户无感知,只知道由谁能够给我实现上交班费功能即可。studentsProxy.giveMoney();}
}

动态代理

1.确定创建接口得具体行为

/***  确定具体得行为接口* */
public interface Person {// 上交班费void giveMoney();
}

2.确定被代理对象实现接口,并且完成具体业务逻辑

/*** 被代理类*/
public class Student implements Person {@Overridepublic void giveMoney() {System.out.println("学生上交班费....");}
}

3.自定义一个InvocationHandler类,并且实现InvocationHandler接口,这个类种会持有一个被代理对象target,并且InvocationHandler中有一个invoke方法,所有执行代理对象得方法都会被替换成执行invoke方法

/*** @Author Tang**/
public class StudentInvocationHandler implements InvocationHandler {// 持有一个被代理对象T target;// 定义一个构造器public StudentInvocationHandler(T target) {this.target = target;}/*** proxy:代表动态代理对象* method 代表正在执行得方法* args:代表调用目标方法时传入的实参*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("执行方法....");method.invoke(target, args);System.out.println("执行结束,结果为:");return "执行成功....";}
}

4.测试

public class ProxyTest {public static void main(String[] args) {// 生成一个被代理类Person student =  new Student();StudentInvocationHandler studentInvocationHandler = new StudentInvocationHandler(student);// 使用Proxy得静态方法创建代理类   // 第一个参数是我们被代理的对象 也可以写成它实现的接口 // 第二个 interface对象数组 表明代理类实现了这些接口 那么代理类就可以调用接口中声明的所有方法。// 第三个 表示的是当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象上Person personProxy=(Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Person.class}, studentInvocationHandler);//使用动态代理类来personProxy.giveMoney();}
}
public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

这个方法的作用就是创建一个代理类对象,它接收三个参数,我们来看下几个参数的含义:

loader:一个classloader对象,定义了由哪个classloader对象对生成的代理类进行加载
interfaces:一个interface对象数组,表示我们将要给我们的代理对象提供一组什么样的接口,如果我们提供了这样一个接口对象数组,那么也就是声明了代理类实现了这些接口,代理类就可以调用接口中声明的所有方法。
h:一个InvocationHandler对象,表示的是当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象上,并最终由其调用。

相关内容

热门资讯

重庆四天三晚旅游行程+美食推荐... 一直听闻重庆是座充满魅力的城市,那魔幻的8D地形、火辣的美食、热情的民风,都像磁石一般吸引着我。从深...
原创 任... 最近,一张来自迪拜的照片在网上引起了热议:印度裔富商萨提许·桑帕尔(Satish Sanpal)在父...
夏令营:为暑假注入充实生活 当暑假的钟声敲响,孩子们如同挣脱牢笼的小鸟,满心期待着一段自由而欢快的时光。然而,如何让这个暑假过得...
北京3天自由行花费揭秘,带男朋... 宝子们,北京这座城市,那可是集万千魅力于一身。它是历史文化的宝库,承载着千年的岁月沉淀,故宫的红墙黄...
四川参团五天费用预算多少?四川... 家人们,四川简直就是旅游界的“宝藏之地”!它就像一个巨大的自然与人文交融的宝库,散发着无穷的魅力。 ...
西安四天三夜旅游攻略,西安4天... 作为一个对历史文化充满好奇,又热衷于探索各地美食的旅行者,我一直对西安这座千年古都心驰神往。终于,在...
“学讲普通话,逐步养成讲普通话... “学讲普通话,逐步养成讲普通话的习惯;能认真听别人讲话,努力了解讲话的主要内容;听故事、看音像作品,...
描写老人经历许多的句子? 描写老人经历许多的句子?那个老人家在外面漂泊了一生,饱经沧桑,他的每一道皱纹都是他的经历的写照,经历...
春节档的动画电影总共有几部? 春节档的动画电影总共有几部?2022年春节档的动皮睁画电影一共有5部,今年春节档上映的电影一共有14...
讲神明或阴阳师、狐仙之类的的动... 讲神明或阴阳师、狐仙之类的的动漫我的狐仙女友我的狐仙女友守护猫娘绯鞠 滑头鬼之孙 传颂之物 虫...
为周杰伦写的诗、 为周杰伦写的诗、谁能帮我写一首关于周杰伦的诗 赞美他的 要有文采的、许嵩的儿子!!前阵子 自己写了一...
请推荐一些吴京演的电影及电视剧... 请推荐一些吴京演的电影及电视剧(比较经典一点的)最近没事想看看吴京演的电影及电视剧,请大家推荐几部,...
游戏王的一只怪兽,向日葵和狮子... 游戏王的一只怪兽,向日葵和狮子的形状,送入墓地后有两个可以用作祭品的衍生物你想说什么?蒲公英狮。日文...
日记、是写在日记本上好、还是这... 日记、是写在日记本上好、还是这在手机上好?拿小号来写日记发表、不给别人看、还是以传统的写在日记本上呢...
祖阿曼怎么开门 祖阿曼怎么开门进本和中间的NPC对话,然后敲锣就可以了先和头上有标记的对话,然后和他一起敲箩,要几个...
奇瑞瑞虎8的内饰差吗?它的油耗... 奇瑞瑞虎8的内饰差吗?它的油耗高吗?我认为奇瑞瑞虎8这款车的内饰非常的豪华,非常的不错,做工也很高大...
安娜卡列尼娜主要内容 故事梗概... 安娜卡列尼娜主要内容 故事梗概讲述的是什么 1、安娜卡列尼娜主要内容,故事梗概讲述的是什么,该...
有谁知道有部汽车类动画片主人公... 有谁知道有部汽车类动画片主人公是洽克?有谁知道有部汽车类动画片主人公也是一辆汽车,名字叫洽克?恰克大...
女人想不想念你,主要看哪4种行... 女人想不想念你,主要看哪4种行为表现,一目了然?看女人会不会找你聊天,看女人会不会接你下班,看女人会...
不朽之名曲exo下期还唱不唱? 不朽之名曲exo下期还唱不唱?比如说这期唱的人是exo,下期他们还唱不?如果东方卫视想保证收视率就会...