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

给女朋友做的网站源码最新seo教程

给女朋友做的网站源码,最新seo教程,seo整站优化的思路及步骤,软件推荐网站2023.11.12 代理模式是GoF23种设计模式之一,其作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以…

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.dt0577.cn/news/26976.html

相关文章:

  • 网站源码下载插件百度推广有哪些售后服务
  • 网站规划与建设 ppt网络营销的效果是什么
  • 做网站图片什么软件柳市网站制作
  • 网站空间续费合同网络软营销
  • 河南省建设教育培训中心网站全国疫情最新名单
  • 金融网站框架模板广告公司怎么找客户资源
  • 合肥专业网站建设公司seo网络优化培训
  • 网站无法被百度收录在线seo优化工具
  • 仙桃做网站的个人写软文用什么软件
  • 网站开发怎么接单域名怎么注册
  • 做合成照片的国外网站sem推广竞价托管公司
  • logo素材网站有哪些今日头条新闻最全新消息
  • 肇庆有哪家做企业网站的seo值是什么意思
  • 怎么把在EXCEL做的查询系统做到网站上公司网站建设平台
  • 网站建设客户分析关键词出价计算公式
  • html5移动网站开发适合30岁女人的培训班
  • 做免费的独立电商网站百度自动点击器
  • 网站标题符号推广注册app拿佣金
  • liferay做网站好吗搜索引擎优化课程
  • 威海建设集团网站首页微信公众号软文怎么写
  • 网站域名怎么改个人网站设计图片
  • 官方网站建设公电商关键词查询工具
  • 北京网站开发网站建设报价软文营销案例分析
  • 响应式网站模板滚动条北京全网推广
  • 可以上传图片的网站怎么做网络销售推广是做什么的具体
  • 电梯行业网站怎么做免费的关键词优化软件
  • wordpress做商城网站百度会员登录入口
  • 做复刻衣服买网站百度网站推广排名优化
  • 怎样做班级网站营销策划公司经营范围
  • 网站开发之美 pdf2024年3月新冠肺炎