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

南京最大网站建设公司dw网站建设流程

南京最大网站建设公司,dw网站建设流程,微盟微商城多少钱一年?,电脑网页制作培训2023.11.12 代理模式是GoF23种设计模式之一#xff0c;其作用是#xff1a;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下#xff0c;一个客户不想或者不能直接引用一个对象#xff0c;此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以…2023.11.12 代理模式是GoF23种设计模式之一其作用是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下一个客户不想或者不能直接引用一个对象此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用并且可以通过代理对象去掉客户不应该看到的内容和服务或者添加客户需要的额外服务。 代理模式中的角色代理类、目标类、代理类和目标类的公共接口(客户端在使用代理类时就像在使用目标类不被客户端所察觉所以代理类和目标类要有共同的行为也就是实现共同的接口)。 代理模式有动态代理和静态代理两种模式先实现静态代理作为引入。 静态代理 考虑一个业务场景某个项目已上线并且运行正常只是客户反馈系统有一些地方运行较慢要求项目组对系统进行优化。于是项目负责人就下达了这个需求。首先需要搞清楚是哪些业务方法耗时较长于是让我们统计每个业务方法所耗费的时长。 第一种方案直接修改Java源代码在每个业务方法中添加统计逻辑。这种方法可以满足需求但显然是违背了OCP开闭原则这种方案不可取。 第二种方案编写一个子类继承OrderServiceImpl在子类中重写每个方法。这种方式也可以解决需求但是由于采用了继承的方式导致代码之间的耦合度较高。 第三种方案就是使用静态代理了 先准备一个接口类和实现类 package service;public interface OrderService {void generate();void detail();void modify(); }package service;public class OrderServiceImpl implements OrderService{Overridepublic void generate() {try {Thread.sleep(1234);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(订单已生成);}Overridepublic void detail() {try {Thread.sleep(2541);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(订单信息如下******);}Overridepublic void modify() {try {Thread.sleep(1010);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(订单已修改);} }其中Thread.sleep()方法的调用是为了模拟操作耗时。 采用静态代理为OrderService接口提供一个代理类。 package service;public class OrderServiceProxy implements OrderService{// 目标对象private OrderService orderService;// 通过构造方法将目标对象传递给代理对象public OrderServiceProxy(OrderService orderService) {this.orderService orderService;}Overridepublic void generate() {long begin System.currentTimeMillis();// 执行目标对象的目标方法orderService.generate();long end System.currentTimeMillis();System.out.println(耗时(end - begin)毫秒);}Overridepublic void detail() {long begin System.currentTimeMillis();// 执行目标对象的目标方法orderService.detail();long end System.currentTimeMillis();System.out.println(耗时(end - begin)毫秒);}Overridepublic void modify() {long begin System.currentTimeMillis();// 执行目标对象的目标方法orderService.modify();long end System.currentTimeMillis();System.out.println(耗时(end - begin)毫秒);} }这种方式的优点符合OCP开闭原则同时采用的是关联关系所以程序的耦合度较低。所以这种方案是被推荐的。 下面在客户端中使用代理对象 import service.OrderService; import service.OrderServiceImpl; import service.OrderServiceProxy;public class Client {public static void main(String[] args) {//创建目标对象OrderService target new OrderServiceImpl();//创建代理对象OrderService proxy new OrderServiceProxy(target);//调用代理对象的代理方法proxy.generate();proxy.modify();proxy.detail();} }运行结果 以上就是代理模式中的静态代理其中OrderService接口是代理类和目标类的共同接口。OrderServiceImpl是目标类。OrderServiceProxy是代理类。 但是如果系统中业务接口很多一个接口对应一个代理类显然也是不合理的会导致类爆炸。怎么解决这个问题动态代理可以解决。 动态代理 在程序运行阶段在内存中动态生成代理类被称为动态代理目的是为了减少代理类的数量。解决代码复用的问题。 在内存当中动态生成类的技术常见的包括 JDK动态代理技术只能代理接口。CGLIB动态代理技术CGLIB(Code Generation Library)是一个开源项目。是一个强大的高性能高质量的Code生成类库它可以在运行期扩展Java类与实现Java接口。它既可以代理接口又可以代理类底层是通过继承的方式实现的。性能比JDK动态代理要好。底层有一个小而快的字节码处理框架ASM。Javassist动态代理技术Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba 千叶 滋所创建的。它已加入了开放源代码JBoss 应用服务器项目通过使用Javassist对字节码操作为JBoss实现动态AOP框架。 这里简单实现一下JDK动态代理技术 我们在静态代理的时候除了以上一个接口和一个实现类之外还要写一个代理类UserServiceProxy。在动态代理中UserServiceProxy代理类是可以动态生成的。这个类不需要写。我们直接写客户端程序即可 import service.OrderService; import service.OrderServiceImpl; import service.TimerInvocationHandler;import java.lang.reflect.Proxy;public class client {public static void main(String[] args) {// 第一步创建目标对象OrderService target new OrderServiceImpl();// 第二步创建代理对象OrderService orderServiceProxy (OrderService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new TimerInvocationHandler(target));// 第三步调用代理对象的代理方法// 调用代理对象的代理方法orderServiceProxy.detail();orderServiceProxy.modify();orderServiceProxy.generate();} }以上第二步创建代理对象是重点其中newProxyInstance()方法有三个参数 第一个参数类加载器。在内存中生成了字节码要想执行这个字节码也是需要先把这个字节码加载到内存当中的。所以要指定使用哪个类加载器加载。第二个参数接口类型。代理类和目标类实现相同的接口所以要通过这个参数告诉JDK动态代理生成的类要实现哪些接口。第三个参数调用处理器。这是一个JDK动态代理规定的接口接口全名java.lang.reflect.InvocationHandler。显然这是一个回调接口也就是说调用这个接口中方法的程序已经写好了就差这个接口的实现类了。 接下来要写一下java.lang.reflect.InvocationHandler接口的实现类并且实现接口中的方法代码如下 package service;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method;public class TimerInvocationHandler implements InvocationHandler {// 目标对象private Object target;// 通过构造方法来传目标对象public TimerInvocationHandler(Object target) {this.target target;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 目标执行之前增强。long begin System.currentTimeMillis();// 调用目标对象的目标方法Object retValue method.invoke(target, args);// 目标执行之后增强。long end System.currentTimeMillis();System.out.println(耗时(end - begin)毫秒);// 一定要记得返回哦。return retValue;} }InvocationHandler接口中有一个方法invoke这个invoke方法上有三个参数 第一个参数Object proxy。代理对象。设计这个参数只是为了后期的方便如果想在invoke方法中使用代理对象的话尽管通过这个参数来使用。第二个参数Method method。目标方法。第三个参数Object[] args。目标方法调用时要传的参数。 最后可以运行客户端程序了运行结果
http://www.hkea.cn/news/14485383/

相关文章:

  • 做网站被骗预付款怎么办浏览器代理怎么弄
  • 广州网站推广排名网站的排版包括什么
  • 互联网招聘网站排名服务器做两个网站
  • 主流网站模板微博搜索引擎优化
  • php网站屏蔽词怎么做服装店网站建设思路
  • 垄断了网站建设lisp 网站开发
  • 二级域名网站怎么做微信小程序开发教程pdf
  • 网站顶部菜单下拉固定手机网站开发兼容性
  • 网站制作开票几个点无锡专业做网站的公司哪家好
  • 企业做网站哪家公司好像网站分类一样的表格图怎么做
  • 制作微信网站模板下载穷人装修3万硬装
  • 网站建设运营费用包括哪些高校网站建设滞后
  • 金堂县建设局网站图跃企业网站建设
  • 数字博物馆网站建设html水平导航栏怎么做
  • 网站网站建设策划书wordpress附件分类存放
  • 成都网站建设维护中国建筑企业网
  • 网站软件免费下载大全wordpress app无法登陆
  • html网站开发事例教程phpcms 外贸网站模板
  • 如何建网站费用多少南充 网站开发
  • 学校做的网站外面访问不了网站空间 群集
  • 淄博网站建设 很乱自己建设网站难不难
  • 高端网站公司一起做网店
  • 公司网站规划案例姜堰做网站
  • 舟山网站建设费用注册网站如何备案
  • 徐州做网站的公司招聘设计制作小车视频
  • wordpress网站从零房地产设计方案
  • 佛山出格建站网站开发需要证书吗
  • 怎么制作网站编辑页面ps工具设计网站
  • 长沙做网站需要多少钱做网站先用dw还是asp
  • 甘肃网站设计公司用外服务器做网站