Java学习路线-57:静态代理和动态代理
发布日期:2021-07-01 06:11:32 浏览次数:2 分类:技术文章

本文共 2409 字,大约阅读时间需要 8 分钟。

静态代理

角色分析

  1. 抽象角色 接口或者抽象类
  2. 真实角色 被代理的角色
  3. 代理角色 代理真实角色,一般会做一些附属操作
  4. 客户角色 使用代理角色进行一些操作
AbstractObject    - RealObject    - ProxyClient

代码实现

package com.pengshiyu.proxy;// 租借接口public interface IRent {
void rent();}
package com.pengshiyu.proxy;public class Host implements IRent{
@Override public void rent() {
System.out.println("房东租房"); }}
package com.pengshiyu.proxy;// 中介public class Proxy implements IRent{
private Host host; public Proxy(Host host){
this.host = host; } @Override public void rent() {
this.beforeRent(); this.host.rent(); this.afterRent(); } private void beforeRent(){
System.out.println("中介带看房"); } private void afterRent(){
System.out.println("签订合同"); }}
package com.pengshiyu.proxy;// 客户public class Client {
public static void main(String[] args) {
Host host = new Host(); Proxy proxy = new Proxy(host); proxy.rent(); }}

使用静态代理

好处:

  1. 使得真实角色处理业务更加纯粹,不再关注公共的问题
  2. 公共业务由代理类完成,实现业务的分工
  3. 公共业务发生扩展时变得更加集中和方便

缺点

  1. 类多了,代理类,工作量变大,开发效率降低

动态代理

动态代理和静态代理的角色是一样的

动态代理的代理类是动态生成的

分类:

  1. 基于接口的动态代理 jdk 动态代理
  2. 基于类的动态代理 cglib、javasist

一个动态代理,一般代理某一类业务,可以代理多个类

package com.pengshiyu.proxy;public interface IVehicle {
void run();}
package com.pengshiyu.proxy;public class Car implements IVehicle {
public void run() {
System.out.println("Car会跑"); }}
package com.pengshiyu.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class VehicleInvocationHandler implements InvocationHandler {
private Object target; public VehicleInvocationHandler(Object target){
this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("---------before-------"); Object result = method.invoke(target, args); System.out.println("---------after-------"); return result; }}
package com.pengshiyu.proxy;import java.lang.reflect.Proxy;// 客户public class Client {
public static void main(String[] args) {
IVehicle car = new Car(); IVehicle carProxy = (IVehicle)Proxy.newProxyInstance( car.getClass().getClassLoader(), car.getClass().getInterfaces(), new VehicleInvocationHandler(car) ); carProxy.run(); }}

转载地址:https://pengshiyu.blog.csdn.net/article/details/106889171 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java学习路线-58:AOP面向切面编程
下一篇:Java学习路线-56:Spring与Ioc

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年05月02日 03时00分43秒