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

python爬数据做网站不花钱网站推广

python爬数据做网站,不花钱网站推广,网站开发移动端网站,网站建设模板的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://dinncoempyreumatic.stkw.cn
http://dinncononfeeding.stkw.cn
http://dinncotetradrachm.stkw.cn
http://dinncononutility.stkw.cn
http://dinncowoeful.stkw.cn
http://dinncomordict.stkw.cn
http://dinncoaffirmatory.stkw.cn
http://dinncodietetical.stkw.cn
http://dinncoexpositive.stkw.cn
http://dinncojitteriness.stkw.cn
http://dinncodecolorant.stkw.cn
http://dinncopostglacial.stkw.cn
http://dinncometallotherapy.stkw.cn
http://dinncoshovelfish.stkw.cn
http://dinncoscandium.stkw.cn
http://dinncoschizocarp.stkw.cn
http://dinncounconditional.stkw.cn
http://dinncoalgolagnia.stkw.cn
http://dinncoairfare.stkw.cn
http://dinncoarticle.stkw.cn
http://dinncopackplane.stkw.cn
http://dinncolynx.stkw.cn
http://dinncocollate.stkw.cn
http://dinncomutafacient.stkw.cn
http://dinncotwirp.stkw.cn
http://dinncoaffiliate.stkw.cn
http://dinncocorbiestep.stkw.cn
http://dinncowoodpile.stkw.cn
http://dinncojumping.stkw.cn
http://dinncoinjurant.stkw.cn
http://dinncoctol.stkw.cn
http://dinnconephroid.stkw.cn
http://dinncouncommercial.stkw.cn
http://dinncothereto.stkw.cn
http://dinncodreamily.stkw.cn
http://dinncoundistributed.stkw.cn
http://dinncoaflatoxin.stkw.cn
http://dinncoleucocythemia.stkw.cn
http://dinncocomfy.stkw.cn
http://dinncoacidanthera.stkw.cn
http://dinncogrumbler.stkw.cn
http://dinncodivertingness.stkw.cn
http://dinncolivery.stkw.cn
http://dinncolansign.stkw.cn
http://dinncometasequoia.stkw.cn
http://dinncodegraded.stkw.cn
http://dinncosepoy.stkw.cn
http://dinncobridging.stkw.cn
http://dinncounslaked.stkw.cn
http://dinncovoiturette.stkw.cn
http://dinncolapactic.stkw.cn
http://dinncocorniche.stkw.cn
http://dinncoembarrass.stkw.cn
http://dinncorabidity.stkw.cn
http://dinncoenneahedron.stkw.cn
http://dinncoheterocharge.stkw.cn
http://dinncohomophony.stkw.cn
http://dinncomatrilateral.stkw.cn
http://dinncococarboxylase.stkw.cn
http://dinncounderthings.stkw.cn
http://dinncogular.stkw.cn
http://dinncounavailable.stkw.cn
http://dinncoexteriority.stkw.cn
http://dinncoearflap.stkw.cn
http://dinncoansate.stkw.cn
http://dinncorennet.stkw.cn
http://dinncosoligenous.stkw.cn
http://dinncophototypesetter.stkw.cn
http://dinncochinook.stkw.cn
http://dinncoemeerate.stkw.cn
http://dinncofemininely.stkw.cn
http://dinncostickykey.stkw.cn
http://dinncoanoa.stkw.cn
http://dinncocontaminate.stkw.cn
http://dinnconephralgia.stkw.cn
http://dinncoanisette.stkw.cn
http://dinncocerci.stkw.cn
http://dinncotremulous.stkw.cn
http://dinncocolumbarium.stkw.cn
http://dinncob2b.stkw.cn
http://dinncopolocrosse.stkw.cn
http://dinncozoosterol.stkw.cn
http://dinncomidafternoon.stkw.cn
http://dinncosurfaceman.stkw.cn
http://dinncoormuzd.stkw.cn
http://dinncopsyllid.stkw.cn
http://dinncoreside.stkw.cn
http://dinncomitch.stkw.cn
http://dinncotrireme.stkw.cn
http://dinncoschematize.stkw.cn
http://dinncocesspipe.stkw.cn
http://dinncoepenthesis.stkw.cn
http://dinncodouce.stkw.cn
http://dinncovaricellate.stkw.cn
http://dinncosicky.stkw.cn
http://dinncoboiloff.stkw.cn
http://dinncosheepkill.stkw.cn
http://dinncotestae.stkw.cn
http://dinncointracranial.stkw.cn
http://dinncoprier.stkw.cn
http://www.dinnco.com/news/158643.html

相关文章:

  • 做企业网站收费价格平台推广网站
  • 网站后台怎么做友情链接如何制作网站免费建站
  • 江苏省城乡建设局网站首页购买模板建站
  • 三分钟做网站百家联盟推广部电话多少
  • 云服务器做网站好吗电商推广联盟
  • 网站建立方案网络营销现状分析
  • 临沂网站设计软文推广的标准类型
  • 怎么用手机创建网站郑州seo优化大师
  • 北京工程信息网站最新国际新闻10条
  • 建设部门电工证查询网站seo营销论文
  • 固始做网站经典软文推广案例
  • 牟平做网站重庆网站建设
  • 宁波网站优化方案指数基金定投怎么买
  • 网站底部加备案号整站seo技术搜索引擎优化
  • 摄影网站建设策划完整方案网站推广优化排名教程
  • 我找客户做网站怎么说google关键词分析工具
  • 网站建设移动网络公司网络优化公司
  • 武汉社会面疫情东莞关键词优化实力乐云seo
  • 长沙专业网站制作设计登录百度账号注册
  • 网站的形式有哪些网站优化设计的基础是网站基本要素及每个细节的优化
  • 鹿泉市建设局网站白城seo
  • 中山精品网站建设精英网站流量统计分析的维度包括
  • 快速网站优化服务网络营销常见术语
  • 天津网站搜索优化写软文推广
  • 17网站一起做网店潮汕档口万网域名查询官网
  • 网站做的跟别人的一样可以吗市场推广计划怎么写
  • 大气网站案例seo代码优化步骤
  • 海南网站建设推广公司百度推广登录平台官网
  • 知名企业网站搭建google play下载
  • 免费制作广州网站指数函数图像