代理模式【静态代理和动态代理实现业务功能扩展】

这篇具有很好参考价值的文章主要介绍了代理模式【静态代理和动态代理实现业务功能扩展】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

静态代理

  • 我们在不修改业务的情况下想要给它增加一些功能,这就需要使用代理模式。
  • 我们不会在原有业务上直接修改,为了避免修改导致程序不可逆转的破坏。
  • 三种角色:抽象角色-接口、真实角色-实现类和代理角色-代理类。
  • 真实角色和代理角色继承的是同一个抽象角色接口!

业务接口类 

负责抽象出业务需要的功能。

//抽象业务
public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

业务的实现类

public class UserServiceImpl implements UserService{
    @Override
    public void add() {
        System.out.println("增加了一个用户");
    }

    @Override
    public void delete() {
        System.out.println("删除了一个用户");
    }

    @Override
    public void update() {
        System.out.println("修改了一个用户");
    }

    @Override
    public void query() {
        System.out.println("查询了一个用户");
    }
}

代理类

假如我们现在要给业务增加一个新的功能-输出日志功能,我们需要通过一个代理类来实现 ,而不是直接在旧业务上修改代码。

我们增加一个 log 方法(拓展功能),我们需要一个 set 方法来使代理能够通过旧的实现类调用旧的业务。


//代理实现增删改查
public class UserServiceProxy implements UserService{

    UserServiceImpl userService;

    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

    @Override
    public void add() {
        log("add");
        userService.add();
    }

    @Override
    public void delete() {
        log("delete");
        userService.delete();
    }

    @Override
    public void update() {
        log("update");
        userService.update();
    }

    @Override
    public void query() {
        log("query");
        userService.query();
    }

    public void log(String message){
        System.out.println("使用了" + message + "方法");
    }
}

测试

这样我们的只需要给代理设置旧业务的实现类就实现了业务的功能扩展。

public class Client {
    public static void main(String[] args) {
        UserServiceImpl service = new UserServiceImpl();
        UserServiceProxy proxy = new UserServiceProxy();
        proxy.setUserService(service);
        proxy.add();
    }
}

动态代理

  • 动态代理个静态代理角色一样(抽象角色-接口、真实角色-实现类和代理角色-代理类)
  • 动态代理的代理类是通过反射动态生成的!
  • 动态代理按照实现可以分我:基于接口的 和 基于类的动态代理。
    • 基于接口:JDK 动态代理
    • 基于类:cglib
  • 需要了解两个类:Proxy:代理、InvocationHandler:调用处理程序。
  • 一个动态代理类就是一个接口!
  • 一个动态代理类可以代理多个真实角色类,只需要继承同一个业务接口即可。
  • 使用动态代理可以大大减少代码量!因为它使用了反射!

Proxy:

代理模式【静态代理和动态代理实现业务功能扩展】,Spring,设计模式,代理模式,java,spring

Proxy 一共只有4个方法:

代理模式【静态代理和动态代理实现业务功能扩展】,Spring,设计模式,代理模式,java,spring 

 

 InvocationHandler:

InvocationHandler是一个接口!

代理模式【静态代理和动态代理实现业务功能扩展】,Spring,设计模式,代理模式,java,spring

InvocationHandler 整个类里只有一个方法:invoke方法。 

代理模式【静态代理和动态代理实现业务功能扩展】,Spring,设计模式,代理模式,java,spring

 动态代理的实现

抽象角色

//抽象业务
public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

真实角色

public class UserServiceImpl implements UserService {
    @Override
    public void add() {
        System.out.println("增加了一个用户");
    }

    @Override
    public void delete() {
        System.out.println("删除了一个用户");
    }

    @Override
    public void update() {
        System.out.println("修改了一个用户");
    }

    @Override
    public void query() {
        System.out.println("查询了一个用户");
    }
}

代理角色

使用 Object 作为抽象角色,这样这一个代理类就可以当做工具类来给任何真实角色进行功能扩展!

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//代理处理程序
public class ProxyInvocationHandler implements InvocationHandler {

    //被代理的接口
    private Object target;

    public void setUserService(Object target) {
        this.target = target;
    }

    //生成并得到代理类
    public Object getProxy(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
    }

    //处理代理实例,调用抽象接口的方法,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //动态代理的本质就是使用反射机制实现!
        fun1();
        log(method.getName());
        Object result = method.invoke(target, args);
        fun2();
        return result;
    }

    public void fun1(){
        System.out.println("扩展功能1");
    }
    public void fun2(){
        System.out.println("扩展功能2");
    }
    public void log(String message){
        System.out.println("执行了" + message + "方法");
    }
}

测试

public class Client {
    public static void main(String[] args) {
        //真实角色
        UserServiceImpl userService = new UserServiceImpl();
        //代理角色
        ProxyInvocationHandler handler = new ProxyInvocationHandler();
        //设置要代理的真实对象
        handler.setUserService(userService);

        //动态生成代理类
        UserService proxy = (UserService) handler.getProxy();
        proxy.add();
        proxy.delete();

    }
}

输出结果:文章来源地址https://www.toymoban.com/news/detail-592899.html

扩展功能1
执行了add方法
增加了一个用户
扩展功能2
扩展功能1
执行了delete方法
删除了一个用户
扩展功能2

到了这里,关于代理模式【静态代理和动态代理实现业务功能扩展】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java代理模式——静态代理与动态代理

    代理模式允许你为其他对象提供一个代理,以控制对这个对象的访问。代理模式在不改变实际对象的情况下,可以在访问对象时添加额外的功能。 可以理解为代理模式为被代理对象创造了一个替身,调用者可以通过这个替身去实现这个被代理对象的功能,这个替身也可以为被

    2024年02月13日
    浏览(47)
  • 代理模式:静态代理+JDK/CGLIB 动态代理

    代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法

    2024年02月13日
    浏览(37)
  • 温故知新之:代理模式,静态代理和动态代理(JDK动态代理)

    代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。 静态代理 是一种代理模式的实现方式,它在编译期间就已经确定了代理对象,需要为每一个被代理对象创建一个代理类。静态代理的实现比较简单,但是每个被代理对象都需要创建

    2024年02月11日
    浏览(48)
  • Spring AOP与静态代理/动态代理

    代理模式是一种结构型设计模式,它允许对象提供替代品或占位符,以控制对这个对象的访问。代理对象通常充当客户端和实际服务对象之间的中介,以实现对服务对象的间接访问。 代理模式的实现有许多种方式,其中最常见的方式是静态代理和动态代理。 静态代理是指,

    2024年02月10日
    浏览(30)
  • Java 代理模式详解,静态代理与动态代理的区别及优缺点

    代理模式是一种常用的设计模式,它允许通过引入一个代理对象来控制对目标对象的访问。在Java中,代理模式被广泛应用,它可以提供额外的功能,如权限检查、缓存、日志记录等,同时还能在不修改目标对象的情况下对其进行扩展。 代理模式(Proxy Pattern)是指通过代理对象

    2024年02月11日
    浏览(44)
  • 代理模式 静态代理和动态代理(jdk、cglib)——Java入职第十一天

            一个类代表另一个类去完成扩展功能,在主体类的基础上,新增一个代理类,扩展主体类功能,不影响主体,完成额外功能。比如买车票,可以去代理点买,不用去火车站,主要包括静态代理和动态代理两种模式。 代理类中包含了主体类 无法根据业务扩展,每一次

    2024年02月10日
    浏览(51)
  • 代理模式以及静态代理、JDK代理、Cglib代理的实现

    介绍 1、代理模式:为对象 提供一个替身 ,以控制对这个对象的访问,即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作 (即: 扩展目标对象的功能 ,例如Spring AOP) 2、被代理的对象可以是 远程对象 ,创建开销大的对象

    2024年03月12日
    浏览(44)
  • JavaScript代理模式:如何实现对象的动态代理

    在JavaScript中,代理模式是一种常见的设计模式,它允许我们在不改变对象本身的情况下,通过代理对象来控制对象的访问。代理模式可以用于实现缓存、权限控制、远程调用等功能。 代理模式是指在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途,所

    2024年02月11日
    浏览(44)
  • 【业务功能篇20】Springboot java逻辑实现动态行转列需求

    在此前,我也写过一个行转列的文章,是用存储过程sql处理的一个动态的逻辑 Mysql 存储过程Mybatis框架call调用 实现动态行转列 那么后面我们同样又接收了业务的一个新需求,针对的是不同的业务数据,做的同样的一个展示数据报表,同样还是产品归属信息表头,拼接查询年

    2024年02月09日
    浏览(45)
  • 如何使用静态IP代理解决Facebook多账号注册并进行网络推广业务?

    在当今的数字时代,社交媒体成为了企业进行网络推广的一个重要途径,其中,Facebook是最受欢迎的社交媒体之一,因为它可以让企业通过创建广告和页面来推广他们的产品或服务。 但是,使用Facebook进行网络推广时,很多企业会面临一个问题:不能大量注册账号。那么,这

    2024年01月25日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包