首页 / JAVA / java代理:静态代理和动态代理
java代理:静态代理和动态代理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java代理:静态代理和动态代理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2541字,纯文字阅读大概需要4分钟。
内容图文
一、Java中有一个设计模式是代理模式
代理模式是常用的Java设计模式,特征是代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单的说就是,我们在访问实际对象的时候,是通过代理对象来访问的,代理模式就是在访问实际对象的时候引入一定程度的间接性,因为这种间接性,可以附加多种用途。
二、静态代理
静态代理,由程序员创建或特定工具自动生成源代码,在编译时已经将接口,被代理类(委托类),代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。
简单实现:
假定一个团购长途汽车车票的场景,有50个乘客要去客运站买长途汽车车票,由跟车人去代买50张车票。在这里,乘客有买车票的行为,跟车人也有买车票的行为,那么乘客买车票就可以由跟车人去代理执行。
首先是创建一个买票人的接口。
/** * 买票人接口 */ public interface TickectBuyer { // 买车票 void buyTicket(); }
然后是创建一个乘客类(委托类),去实现买票人接口。
/** * 乘客类,实现了买票人接口 */ public class Passenger implements TickectBuyer { private String name; Passenger(String name) { this.name = name; } @Override public void buyTicket() { System.out.println("乘客【" + name + "】买了一张车票。"); } }
然后是创建一个乘客代理类,同样实现买票人接口。
因为持有一个乘客类对象,所以它可以代理乘客类对象执行买车票的行为。
/** * 乘客代理类,也实现买票人接口 */ public class PassengerProxy implements TickectBuyer { private String name; // 被代理的乘客类 private Passenger passenger; PassengerProxy(String name, Passenger passenger) { this.name = name; // 只代理乘客类 if (passenger.getClass() == Passenger.class) { this.passenger = passenger; } } @Override public void buyTicket() { // 委托类附加的操作 System.out.print("代买人【" + name + "】代"); // 调用委托类(乘客类)的方法 passenger.buyTicket(); } }
最后创建一个测试类测试代理的结果。
/** * 乘客代理测试类 */ public class PassengerProxyTest { public static void main(String[] args) { // 乘客陈小鸡(乘客类) Passenger passenger = new Passenger("陈小鸡"); // 跟车人(乘客代理类) PassengerProxy carFollower = new PassengerProxy("王小狗", passenger); // 由跟车人代理陈小鸡买车票 carFollower.buyTicket(); } }
结果是:代买人【王小狗】代乘客【陈小鸡】买了一张车票。
这里可以看到,代理类可以通过持有委托类对象去调用委托类的方法,从而达到代理委托类去执行委托类行为的目的。然后,在调用委托类方法的时候,可以在调用的前面或者后面添加代理类自己的行为,比如上面代码中添加打印代理人信息的行为。这个就是代理模式的一个很大的优点,可以在代理点切入一些特定的操作,却不会改变原来委托要执行的行为。
内容总结
以上是互联网集市为您收集整理的java代理:静态代理和动态代理全部内容,希望文章能够帮你解决java代理:静态代理和动态代理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。