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

厦门+外贸公司做网站重庆seo网站推广优化

厦门+外贸公司做网站,重庆seo网站推广优化,网站建设元素如何叠加,产品毕业设计作品网站代理模式是一种常用的设计模式,为其他对象提供一种代理以控制对这个对象的访问。代理模式就像是一个中间人,客户端通过代理来间接访问目标对象,可以在不修改目标对象的基础上,对目标对象的功能进行增强或扩展。代理模式主要分为静…

        代理模式是一种常用的设计模式,为其他对象提供一种代理以控制对这个对象的访问。代理模式就像是一个中间人,客户端通过代理来间接访问目标对象,可以在不修改目标对象的基础上,对目标对象的功能进行增强或扩展。代理模式主要分为静态代理和动态代理,本文将详细探讨这两种代理模式。

本文目录

    • 一、静态代理
      • 1. 代码实现
      • 2. 优缺点
    • 二、动态代理
      • 1. JDK动态代理实现
      • 2. CGLIB动态代理

一、静态代理

静态代理是指在编译时就已经确定代理类和目标类的关系。代理类和目标类都需要实现相同的接口,代理类中持有目标类的引用,在代理类的方法中调用目标类的相应方法,并可以在调用前后添加额外的逻辑。

1. 代码实现

// 定义接口
interface UserService {void addUser();void deleteUser();
}// 实现类
class UserServiceImpl implements UserService {@Overridepublic void addUser() {System.out.println("添加用户");}@Overridepublic void deleteUser() {System.out.println("删除用户");}
}// 静态代理类
class UserServiceProxy implements UserService {private UserService target;public UserServiceProxy(UserService target) {this.target = target;}@Overridepublic void addUser() {System.out.println("添加用户前的日志记录");target.addUser();System.out.println("添加用户后的日志记录");}@Overridepublic void deleteUser() {System.out.println("删除用户前的日志记录");target.deleteUser();System.out.println("删除用户后的日志记录");}
}public class StaticProxy {public static void main(String[] args) {UserService target = new UserServiceImpl();UserService proxy = new UserServiceProxy(target);proxy.addUser();System.out.println("-------------------");proxy.deleteUser();}
}

在代理类的方法中,调用目标对象的方法前后添加了日志记录的逻辑

2. 优缺点

  • 优点:实现简单,易于理解,在编译时就可以确定代理关系,性能相对较高。
  • 缺点:代理类和目标类必须实现相同的接口,当接口方法发生变化时,代理类和目标类都需要修改。而且如果需要代理多个不同的目标类,就需要为每个目标类创建一个对应的代理类,代码会变得冗余。



二、动态代理

动态代理是指在运行时动态生成代理类,而不需要在编译时就确定代理类的代码。Java提供了两种实现动态代理的方式:JDK 动态代理和 CGLIB 动态代理。

1. JDK动态代理实现

JDK 动态代理是基于接口的动态代理,它使用 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来实现。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;interface UserService {void addUser();void deleteUser();
}class UserServiceImpl implements UserService {@Overridepublic void addUser() {System.out.println("添加用户");}@Overridepublic void deleteUser() {System.out.println("删除用户");}
}// 自定义InvocationHandler
class MyInvocationHandler implements InvocationHandler {private Object target;public MyInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(method.getName() + " 方法调用前的日志记录");Object result = method.invoke(target, args);System.out.println(method.getName() + " 方法调用后的日志记录");return result;}
}public class JdkDynamicProxy {public static void main(String[] args) {UserService target = new UserServiceImpl();MyInvocationHandler handler = new MyInvocationHandler(target);UserService proxy = (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),handler);proxy.addUser();System.out.println("-------------------");proxy.deleteUser();}
}

这种方式不需要为每个目标类创建代理类,只需要实现 InvocationHandler 接口,就可以为多个目标类提供代理服务。只能代理实现了接口的类,不能代理没有实现接口的类。

2. CGLIB动态代理

CGLIB 动态代理是基于继承的动态代理,可以代理没有实现接口的类。CGLIB是一个强大的、高性能的代码生成库,通过继承目标类来生成代理类。

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;// 目标类
class UserService {public void addUser() {System.out.println("添加用户");}public void deleteUser() {System.out.println("删除用户");}
}// 自定义MethodInterceptor
class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println(method.getName() + " 方法调用前的日志记录");Object result = proxy.invokeSuper(obj, args);System.out.println(method.getName() + " 方法调用后的日志记录");return result;}
}public class CglibDynamicProxy {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(UserService.class);enhancer.setCallback(new MyMethodInterceptor());UserService proxy = (UserService) enhancer.create();proxy.addUser();System.out.println("-------------------");proxy.deleteUser();}
}

可以代理没有实现接口的类,灵活性更高,但是由于是基于继承实现的,所以不能代理 final 类和 final 方法。



← 上一篇 Java进阶——常用类及常用方法详解
记得点赞、关注、收藏哦!
下一篇 Java进阶——数组超详细整理 →
http://www.dtcms.com/wzjs/112433.html

相关文章:

  • 可以做自己的单机网站西安seo网络推广
  • 做党建需要关注网站百度链接提交入口
  • 建设网站企业网上银行登录官方网站网络推广
  • 深圳一定火网站建设网站结构优化的内容和方法
  • 北京保障性住房建设投资中心网站活动营销案例100例
  • 中国建设网站官方网站营销方案策划书
  • 网站地图怎么做网站信息组织优化
  • 学做蛋糕什么网站如何在百度上发布自己的文章
  • 企业网站php源码免费下载seo优化销售话术
  • 如何做指数交易网站兰州网络推广推广机构
  • 南平网站开发公司如何用百度平台营销
  • 广州市广告公司标识系统设计宁德seo培训
  • 徐州营销型网站建设广告点击一次多少钱
  • 免费网站能到百度首页吗怎么用手机制作网站
  • 宿迁做网站 宿迁网站建设深圳seo顾问
  • 北京网站建设代理百度竞价投放
  • 重庆企业网站推广流程品牌网络推广运营公司
  • 西安营销型网站制作手机app免费下载
  • 个人做视频网站烧钱现在有什么技能培训班
  • wordpress多网站建设网络推广引流有哪些渠道
  • 网站里的个人中心下拉列表怎么做排名优化软件点击
  • 商务礼品网站模板网络推广外包内容
  • 公众号开发用什么工具宁波如何做seo排名优化
  • 山东德州网站建设哪家最好seo优化的搜索排名影响因素主要有
  • 加盟网网站建设策划书建站工具
  • ios 常用网站淘宝seo是什么意思啊
  • 推广做网站怎么样杭州seo关键词优化公司
  • 为什么搜索不到刚做的网站北京seo网络优化招聘网
  • 建设ca网站口碑营销策略
  • 青海建设兵团青岛战友网站seo技术分享免费咨询