百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

深入浅出代理模式与动态代理 动态代理的缺点

yuyutoo 2024-10-20 13:09 1 浏览 0 评论

1 概述

代理模式是在二十三种设计模式中比较接近现实生活和容易理解的一种设计模式,简单的来说就是A通过B的代理,与C进行通信,如图:

当然这样看来并没有增加A与C通信的效率,反而多了一层代理,但是,当A多了以后呢?

显然,这样可以只让B与C进行通信,类似于多加了一层的代理层,专门用来处理请求,再来一个现实点的例子:

如果一个人有事想找你你可以直接与他对话,而如果一群人想找你你一定不能同时与他们进行对话,就需要一个一个的回复,比如我们平常的移动联系方式微信,此时他就可以代理你进行消息的接收和回复,如图 :

因此,我们总结下代理模式的概念和优点:

定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

优点:(1)职责清晰 (2)高扩展性(3)智能化

2 代理模式(静态代理)

静态代理简单的说就是接口代理实现类,当一个或多个类实现一个接口后,需要将接口的方法进行实现,当类进行实例化时使用接口进行代理方法的实现,直接调用接口的方法而不是实现类的方法。

/**
* 代理模式(静态代理)
*
* @author 17122
*/
public class StaticProxy {
  public static void main(String[] args) {
    People people = new Programmer();
    people.sayHello();
  }
}
interface People {
  /**
* sayHello方法
*/
  void sayHello();
}
class Student implements People {
  @Override
  public void sayHello() {
    System.out.println("Hello I am a Student");
  }
  public void study() {
    System.out.println("Study");
  }
}
class Programmer implements People {
  @Override
  public void sayHello() {
    System.out.println("Hello I am a Programmer");
  }
  public void playCode() {
    System.out.println("Play code");
  }
}

3 动态代理

动态代理的实现较为复杂,因为要实现动态代理就需要依托Java的反射机制,就是JDK官方原生的代理,继承InvocationHandler接口,实现invoke方法,就可以自定义代理工具类,根据不同的类进行动态的代理。

/**
* 动态代理
*
* @author 17122
*/
public class DynamicProxy {
  public static void main(String[] args) {
    Boos boos = new Boos();
    Worker worker = new Worker();
    getDynamicProxy(worker, Worker.class);
    getDynamicProxy(boos, Boos.class);
  }
/**
* 动态代理实现方法
*
* @param obj
* @param clazz
*/
public static void getDynamicProxy(Object obj, Class clazz) {
  MyInvocationHandler myInvocationHandler = new MyInvocationHandler(obj);
  Courier instance = (Courier) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), myInvocationHandler);
  instance.takeSomething();
}
}
/**
* 快递员
*/
interface Courier {
  /**
* 取东西
*/
  void takeSomething();
}
class Worker implements Courier {
  @Override
  public void takeSomething() {
    System.out.println("Worker take Something");
  }
}
class Boos implements Courier {
  @Override
  public void takeSomething() {
    System.out.println("Boos take Something");
  }
}
class MyInvocationHandler implements InvocationHandler {
  /**
* 被代理的目标类
*/
  private Object target;
  /**
* 构造方法 放入目标类
*
* @param target
*/
  public MyInvocationHandler(Object target) {
    this.target = target;
  }
  /**
* Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler.
* 返回指定接口的代理类实例,该接口将方法调用分派给指定的调用处理程序。
*
* @param proxy the class loader to define the proxy class 定义代理类的类装入器
* @param method the list of interfaces for the proxy class to implement 代理类要实现的接口列表
* @param args the invocation handler to dispatch method invocations to 将方法调用分派到的调用处理程序
* @return
* @throws Throwable
*/
  @Override
  public Object invoke(Object proxy, Method method, Object[] args)
  throws Throwable {
    Object result = method.invoke(target, args);
    return result;
  }
}

4 静态代理和动态代理有什么不同

(1)最主要的不同就是动态代理依靠反射机制,可以在程序运行的过程中进行被代理对象的确定,而静态代理在程序编译时期就已经确定。

(2)静态代理需要自己写代码进行完成,而动态代理就是通过Proxy.newInstance()生成。

相关推荐

jQuery VS AngularJS 你更钟爱哪个?

在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...

Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0

在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...

如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例

要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...

编程技巧:Jquery实时验证,指定长度的「负小数」

为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...

一篇文章带你用jquery mobile设计颜色拾取器

【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...

编程技巧:Jquery实时验证,指定长度的「正小数」

为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...

jquery.validate检查数组全部验证

问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...

Vue进阶(幺叁肆):npm查看包版本信息

第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...

layui中使用lay-verify进行条件校验

一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...

jQuery是什么?如何使用? jquery是什么功能组件

jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...

django框架的表单form的理解和用法-9

表单呈现...

jquery对上传文件的检测判断 jquery实现文件上传

总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...

Nodejs之MEAN栈开发(四)-- form验证及图片上传

这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...

大数据开发基础之JAVA jquery 大数据java实战

上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...

推荐四个开源的jQuery可视化表单设计器

jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...

取消回复欢迎 发表评论: