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

wordpress 可视化排版谷歌seo服务公司

wordpress 可视化排版,谷歌seo服务公司,网站设计的收费,网络平台管理制度和管理办法概述 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理访问目标对象 这样做的好处是#xff1a;可以在目标对象实现的基础上,增强额外的功能操作#xff0c;即扩展目标对象的功能。 被代理的对象可以是#xff1a;远程对象、创建开销大的对象或需要安全…概述 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理访问目标对象 这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作即扩展目标对象的功能。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时访问对象不适合或者不能直接引用目标对象代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成而动态代理代理类则是在Java运行时动态生成。动态代理又有JDK代理和CGLib代理两种。 结构 代理Proxy模式分为三种角色 抽象主题Subject类 通过接口或抽象类声明真实主题和代理对象实现的业务方法。真实主题Real Subject类 实现了抽象主题中的具体业务是代理对象所代表的真实对象是最终要引用的对象。代理Proxy类 提供了与真实主题相同的接口其内部含有对真实主题的引用它可以访问、控制或扩展真实主题的功能。 静态代理 我们通过案例来感受一下静态代理。 【例】火车站卖票 如果要买火车票的话需要去火车站买票坐车到火车站排队等一系列的操作显然比较麻烦。而火车站在多个地方都有代售点我们去代售点买票就方便很多了。这个例子其实就是典型的代理模式火车站是目标对象代售点是代理对象。类图如下 代码如下 //卖票接口 public interface SellTickets {void sell(); }//火车站 火车站具有卖票功能所以需要实现SellTickets接口 public class TrainStation implements SellTickets {public void sell() {System.out.println(火车站卖票);} }//代售点 public class ProxyPoint implements SellTickets {private TrainStation station new TrainStation();public void sell() {System.out.println(代理点收取一些服务费用);station.sell();} }//测试类 public class Client {public static void main(String[] args) {ProxyPoint pp new ProxyPoint();pp.sell();} }从上面代码中可以看出测试类直接访问的是ProxyPoint类对象也就是说ProxyPoint作为访问对象和目标对象的中介。同时也对sell方法进行了增强代理点收取一些服务费用。 动态代理 JDK动态代理 接下来我们使用动态代理实现上面案例先说说JDK提供的动态代理。Java中提供了一个动态代理类ProxyProxy并不是我们上述所说的代理对象的类而是提供了一个创建代理对象的静态方法newProxyInstance方法来获取代理对象。 代码如下 //卖票接口 public interface SellTickets {void sell(); }//火车站 火车站具有卖票功能所以需要实现SellTickets接口 public class TrainStation implements SellTickets {public void sell() {System.out.println(火车站卖票);} }//代理工厂用来创建代理对象 public class ProxyFactory {private TrainStation station new TrainStation();public SellTickets getProxyObject() {//使用Proxy获取代理对象/*newProxyInstance()方法参数说明ClassLoader loader 类加载器用于加载代理类使用真实对象的类加载器即可Class?[] interfaces 真实对象所实现的接口代理模式真实对象和代理对象实现相同的接口InvocationHandler h 代理对象的调用处理程序*/SellTickets sellTickets (SellTickets) Proxy.newProxyInstance(station.getClass().getClassLoader(),station.getClass().getInterfaces(),new InvocationHandler() {/*InvocationHandler中invoke方法参数说明proxy 代理对象method 对应于在代理对象上调用的接口方法的 Method 实例args 代理对象调用接口方法时传递的实际参数*/public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(代理点收取一些服务费用(JDK动态代理方式));//执行真实对象Object result method.invoke(station, args);return result;}});return sellTickets;} }//测试类 public class Client {public static void main(String[] args) {//获取代理对象ProxyFactory factory new ProxyFactory();SellTickets proxyObject factory.getProxyObject();proxyObject.sell();} }使用了动态代理我们思考下面问题 ProxyFactory是代理类吗 ProxyFactory不是代理模式中所说的代理类而代理类是程序在运行过程中动态的在内存中生成的类。通过阿里巴巴开源的 Java 诊断工具Arthas【阿尔萨斯】查看代理类的结构 package com.sun.proxy;import com.itheima.proxy.dynamic.jdk.SellTickets; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException;public final class $Proxy0 extends Proxy implements SellTickets {private static Method m1;private static Method m2;private static Method m3;private static Method m0;public $Proxy0(InvocationHandler invocationHandler) {super(invocationHandler);}static {try {m1 Class.forName(java.lang.Object).getMethod(equals, Class.forName(java.lang.Object));m2 Class.forName(java.lang.Object).getMethod(toString, new Class[0]);m3 Class.forName(com.itheima.proxy.dynamic.jdk.SellTickets).getMethod(sell, new Class[0]);m0 Class.forName(java.lang.Object).getMethod(hashCode, new Class[0]);return;}catch (NoSuchMethodException noSuchMethodException) {throw new NoSuchMethodError(noSuchMethodException.getMessage());}catch (ClassNotFoundException classNotFoundException) {throw new NoClassDefFoundError(classNotFoundException.getMessage());}}public final boolean equals(Object object) {try {return (Boolean)this.h.invoke(this, m1, new Object[]{object});}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final String toString() {try {return (String)this.h.invoke(this, m2, null);}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final int hashCode() {try {return (Integer)this.h.invoke(this, m0, null);}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}}public final void sell() {try {this.h.invoke(this, m3, null);return;}catch (Error | RuntimeException throwable) {throw throwable;}catch (Throwable throwable) {throw new UndeclaredThrowableException(throwable);}} }从上面的类中我们可以看到以下几个信息 代理类$Proxy0实现了SellTickets。这也就印证了我们之前说的真实类和代理类实现同样的接口。代理类$Proxy0将我们提供了的匿名内部类对象传递给了父类。 动态代理的执行流程是什么样 下面是摘取的重点代码 //程序运行过程中动态生成的代理类 public final class $Proxy0 extends Proxy implements SellTickets {private static Method m3;public $Proxy0(InvocationHandler invocationHandler) {super(invocationHandler);}static {m3 Class.forName(com.itheima.proxy.dynamic.jdk.SellTickets).getMethod(sell, new Class[0]);}public final void sell() {this.h.invoke(this, m3, null);} }//Java提供的动态代理相关类 public class Proxy implements java.io.Serializable {protected InvocationHandler h;protected Proxy(InvocationHandler h) {this.h h;} }//代理工厂类 public class ProxyFactory {private TrainStation station new TrainStation();public SellTickets getProxyObject() {SellTickets sellTickets (SellTickets) Proxy.newProxyInstance(station.getClass().getClassLoader(),station.getClass().getInterfaces(),new InvocationHandler() {public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(代理点收取一些服务费用(JDK动态代理方式));Object result method.invoke(station, args);return result;}});return sellTickets;} }//测试访问类 public class Client {public static void main(String[] args) {//获取代理对象ProxyFactory factory new ProxyFactory();SellTickets proxyObject factory.getProxyObject();proxyObject.sell();} }执行流程如下 在测试类中通过代理对象调用sell()方法根据多态的特性执行的是代理类$Proxy0中的sell()方法代理类$Proxy0中的sell()方法中又调用了InvocationHandler接口的子实现类对象的invoke方法invoke方法通过反射执行了真实对象所属类(TrainStation)中的sell()方法 CGLIB动态代理 同样是上面的案例我们再次使用CGLIB代理实现。 如果没有定义SellTickets接口只定义了TrainStation(火车站类)。很显然JDK代理是无法使用了因为JDK动态代理要求必须定义接口对接口进行代理。 CGLIB是一个功能强大高性能的代码生成包。它为没有实现接口的类提供代理为JDK的动态代理提供了很好的补充。 CGLIB是第三方提供的包所以需要引入jar包的坐标 dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion2.2.2/version /dependency代码如下 //火车站 public class TrainStation {public void sell() {System.out.println(火车站卖票);} }//代理工厂 public class ProxyFactory implements MethodInterceptor {private TrainStation target new TrainStation();public TrainStation getProxyObject() {//创建Enhancer对象类似于JDK动态代理的Proxy类下一步就是设置几个参数Enhancer enhancer new Enhancer();//设置父类的字节码对象enhancer.setSuperclass(target.getClass());//设置回调函数enhancer.setCallback(this);//创建代理对象TrainStation obj (TrainStation) enhancer.create();return obj;}/*intercept方法参数说明o 代理对象method 真实对象中的方法的Method实例args 实际参数methodProxy 代理对象中的方法的method实例*/public TrainStation intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println(代理点收取一些服务费用(CGLIB动态代理方式));TrainStation result (TrainStation) methodProxy.invokeSuper(o, args);return result;} }//测试类 public class Client {public static void main(String[] args) {//创建代理工厂对象ProxyFactory factory new ProxyFactory();//获取代理对象TrainStation proxyObject factory.getProxyObject();proxyObject.sell();} }三种代理的对比 jdk代理和CGLIB代理 使用CGLib实现动态代理CGLib底层采用ASM字节码生成框架使用字节码技术生成代理类在JDK1.6之前比使用Java反射效率要高。唯一需要注意的是CGLib不能对声明为final的类或者方法进行代理因为CGLib原理是动态生成被代理类的子类。 在JDK1.6、JDK1.7、JDK1.8逐步对JDK动态代理优化之后在调用次数较少的情况下JDK代理效率高于CGLib代理效率只有当进行大量调用的时候JDK1.6和JDK1.7比CGLib代理效率低一点但是到JDK1.8的时候JDK代理效率高于CGLib代理。所以如果有接口使用JDK动态代理如果没有接口使用CGLIB代理。 动态代理和静态代理 动态代理与静态代理相比较最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理InvocationHandler.invoke。这样在接口方法数量比较多的时候我们可以进行灵活处理而不需要像静态代理那样每一个方法进行中转。 如果接口增加一个方法静态代理模式除了所有实现类需要实现这个方法外所有代理类也需要实现此方法。增加了代码维护的复杂度。而动态代理不会出现该问题 优缺点 优点 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用代理对象可以扩展目标对象的功能代理模式能将客户端与目标对象分离在一定程度上降低了系统的耦合度 缺点 增加了系统的复杂度 使用场景 远程Remote代理 本地服务通过网络请求远程服务。为了实现本地到远程的通信我们需要实现网络通信处理其中可能的异常。为良好的代码设计和可维护性我们将网络通信部分隐藏起来只暴露给本地服务一个接口通过该接口即可访问远程服务提供的功能而不必过多关心通信部分的细节。 防火墙Firewall代理 当你将浏览器配置成使用代理功能时防火墙就将你的浏览器的请求转给互联网当互联网返回响应时代理服务器再把它转给你的浏览器。 保护Protect or Access代理 控制对一个对象的访问如果需要可以给不同的用户提供不同级别的使用权限。
http://www.w-s-a.com/news/235355/

相关文章:

  • 青岛做网站那家好网页素材网
  • 宁夏银川做网站的公司网络营销有哪些推广方法
  • 免费域名网站哪个最好东莞企业网站排名
  • dz做网站网址模版
  • 做外贸网站平台中华室内设计师网
  • 三大网络架构seo是啥职业
  • 一个域名可以做中英文两个网站吗搜索引擎营销的6种方式
  • 可以做ppt的网站天津网站建设怎么样
  • 网站怎么做的qq邮件订阅浙江省住房和城乡建设厅网站查询
  • 主机屋网站在线做图片
  • 河南省城乡住房建设厅网站wordpress登陆密码
  • 漳州做网站的公司搭建网站多少时间
  • 网站开发实习计划模板微营销手机
  • 网站设计与制作是做什么工作免费封面设计在线制作生成
  • 网站开发的教学课程网站广告调词软件
  • 进下加强新闻宣传网站建设入门 做网站 书籍
  • 电商网站主题photolux wordpress
  • 周口专业做网站公司深圳市宝安区松岗街道邮政编码
  • 上海企业网站推广方法网络营销策划方案框架
  • 一流的常州网站建设机械加工网报价
  • 上海响应式网站建设公司seo课程总结
  • vs网站开发教程昆山普立斯特做的有网站
  • 柳州网站seo网站swordpress 输出内容
  • 网站设计制作电话多少网站流量下降
  • 沈阳做网站推广的公司唐山哪家做网站好
  • 国外著名网站建设公司WordPress破解怎样主题修复
  • 网站建设济南云畅网络广州电力建设有限公司网站
  • 查看公司信息的网站思特奇是外包公司吗
  • 制作企业网站的目的啥都能看的浏览器
  • 做网站可以用哪些语言如何进行网站运营与规划