当前位置: 首页 > news >正文

木蚂蚁网站正在建设中新业务在线软件下载

木蚂蚁网站正在建设中,新业务在线软件下载,网站开发 jsp,wordpress编辑器格式什么是代理模式? 代理模式是开发中常见的一种设计模式,使用代理模式可以很好的对程序进行横向扩展。代理,顾名思义就是一个真实对象会存在一个代理对象,并且代理对象可以替真实对象完成相应操作,外部通过代理对象来访…

什么是代理模式?

代理模式是开发中常见的一种设计模式,使用代理模式可以很好的对程序进行横向扩展。代理,顾名思义就是一个真实对象会存在一个代理对象,并且代理对象可以替真实对象完成相应操作,外部通过代理对象来访问真实对象并且还可以在代理对象中进行额外操作的扩展。

代理模式的特征是拥有接口、代理类、被代理类。并且代理类与被代理类同时实现该接口。代理类与被代理类之间通常存在一定关联,设计时会在代理类中注册一个被代理类的对象用于调用代理类的方法。这也印证了代理对象依然是执行的真实对象的方法

代理模式又分为静态代理和动态代理

静态代理

静态代理,关键字静态是指在程序运行之前编译时就已经确定了代理类、被代理类、接口。
下面列举两个示例展示静态代理:

  1. 学生通过班长交班费,班长作为学生的代理,学生是被代理,具有同一行为就是交班费,这个行为我们用接口进行约束

程序:

// 接口
public interface Person {void giveMoney();}
// 学生类--> 被代理类
public class Student implements Person{private String name;public Student(String name) {this.name = name;}public void giveMoney() {System.out.println(name+"同学上交50元班费");}
}
// 学生代理类
public class StuProxy implements Person{private Student stu;public StuProxy(Student stu) {if (stu.getClass() == Student.class) {this.stu = stu;}}public void giveMoney() {stu.giveMoney();}
}

测试:

public static void main(String[] args) {// 获取学生实例  Student stu = new Student("张三");// 学生找交钱给班长  学生找到代理StuProxy stuProxy = new StuProxy(stu);// 班长交给老师  代理交钱(交的是学生的钱)stuProxy.giveMoney();
}
  1. 房屋租赁,租客通过中介找房源,租客为被代理类,中介为代理类,接口声明租房方法
// 接口
public interface Rent {void doRent();}
// 被代理类
public class Renter implements Rent{public void doRent() {System.out.println("租客租房了");}
}
// 代理类
public class RentProxy implements Rent{private Renter renter;public RentProxy(Renter renter) {if (renter.getClass()==Renter.class)this.renter = renter;}public void doRent() {renter.doRent();}
}

测试:

public static void main(String[] args) {// 创建租客Renter renter = new Renter();// 租客找到中介RentProxy rentProxy = new RentProxy(renter);// 租客租房rentProxy.doRent();
}

上述两个示例,向代理类中注入被代理对象的方式都是通过构造器注入,当然也可以通过set方法注入

下面演示如果需要在已经编写好的代理类的输出中添加其他操作时的操作比如打印一个日志,在不修改源代码的情况下扩展

// 下面是最经典的Service层的写法
public interface UserService {void del();void select();
}
public class UserServiceImpl implements UserService{public void del() {System.out.println("删除操作");}public void select() {System.out.println("查询操作");}
}

假设现在我们需要在每一次执行操作前后打印一次执行日志,并且不能修改源代码那么就可以用到代理模式,将UserServiceImpl作为被代理类,扩展代理类如下:

public class UserServiceImplProxy implements UserService{private UserServiceImpl userService;// set注入public void setUserService(UserServiceImpl userService) {this.userService = userService;}public void del() {printLog();userService.del();}public void select() {printLog();userService.select();}private void printLog(){System.out.println("执行时间="+new Date());}
}

动态代理

动态代理:代理类在程序运行时被创建的代理方式。

关键在于动态,程序具有了动态特性,可以在运行期间根据不同的目标对象生成动态代理对象,并且可以通过动态代理对象对目标对象(真实对象)进行功能性补强。大白话来讲就是,可以在程序运行期间额外的对真实对象功能进行扩展。

此处的动态代理对象不是通过预先编写好的程序生成的,而是运行期间由于用户需求或者说是代码的指示生成的

动态代理分为两种:一类是基于接口实现的动态代理,另一类是基于类的动态代理
基于接口的动态代理–JDK动态代理通过反射完成,基于类实现的–>cglib

JDK动态代理核心:Proxy类、InvocationHandler接口、要参与代理的目标类必须实现对应接口,比如上述的Student必须实现Person接口。

继续以上述学生交班费为例,更改为动态代理模式:

JDK动态代理中间类:该类需要实现InvocationHandler接口

// JDK动态代理中间类
public class ProxyInvocationHandler implements InvocationHandler {// 被代理的对象private Object target;// ser方法注入参数public void setTarget(Object target) {this.target = target;}// 生成动态代理类public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);}// 处理代理实例,并返回结果public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = method.invoke(target,args);return result;}
}

测试:

public static void main(String[] args) {// 获取真实角色Student stu = new Student("张三三");// 动态代理中间类对象InvocationHandlerProxyStudent proxyStudent = new InvocationHandlerProxyStudent();proxyStudent.setStu(stu);// 代理类实例Person proxy = (Person) proxyStudent.getProxy();// 代理类实例调用方法proxy.giveMoney();
}

上述程序,我们利用Proxy来生成代理类:

public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(),
stu.getClass().getInterfaces(),this);
}

Proxy提供了静态的获取Proxy代理类的方法newProxyInstance,三个参数分别是1.类加载器 2.代理对象实现的接口 3. 调用处理程序(InvocationHandler)

在InvocationHandler官方文档就已经指出,每一个代理实例都关联有一个InvocationHandler调用处理程序,所以这里填this即可

在使用代理类的时候首先我们创建需要被代理的真实对象和动态代理中间类的对象,用set方法将真实对象交给中间类中的代理对象。在调用上述getProxy方法获取代理类。动态代理相对于静态代理有些难以理解,这是因为静态代理的代理类可以在程序中显式的被看到,而动态代理中的代理类文件是缓存在Java虚拟机,类名叫$Proxy0。

在虚拟机中生成的代理类中就会将我们所调用的方法内置,我们在执行proxy.giveMoney()的同时,实际上是将giveMoney()方法作为参数传进invoke()的参数中去,而此时我们就可以将其他的操作交给invoke,由于所有代理对象在执行时最终都会走invoke方法,所以也为我们的开发节省大量代码

http://www.hrbkazy.com/news/52451.html

相关文章:

  • 租香港服务器做网站百度官方推广平台
  • 手机端网站开发流程图最新百度快速排名技术
  • 做一张网站图多少钱网销怎么销售的
  • html静态网页首页模板网站seo优化技巧
  • 网站域名 邮箱单页网站seo如何优化
  • 创意广告视频网站如何设计一个网页
  • 动态网站开发典型案例企业网站的网络营销功能
  • 杭州做网站 做小程序个人网站制作
  • 做淘宝美工图片网站软文营销什么意思
  • wordpress 绿色深圳网站优化公司哪家好
  • 企业网站自己可以做吗网络营销推广是做什么的
  • 简述电子商务网站的开发流程35个成功的市场营销策划案例
  • 惠州做企业网站的新手seo要学多久
  • 想在百度上做网站广东seo快速排名
  • 有代源码怎么做自己网站软件外包公司好不好
  • 做免费的视频网站可以赚钱吗宁波seo网站推广
  • pc 移动端网站建设深圳网站设计公司
  • 毕设做网站心得体验新网站推广最直接的方法
  • 网站seo收费长沙seo网站排名
  • 微企帮做网站52种新颖的促销方式
  • 怎么查看网站访问速度十大管理培训课程
  • 一品威客网兼职平台关键词排名优化公司
  • wordpress创建用户seo技术建站
  • 杭州建设委员会网站成都网站建设seo
  • 建设公司自己的网站seo点击排名
  • 怎样低成本做网站推广点击宝seo
  • 昌平做网站公司百度店铺注册
  • 网站建设与运营的课程总结百度一下网页入口
  • 做mad的素材网站今日中国新闻
  • 独立站有哪些常见平台外国黄冈网站推广平台