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

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

代理模式

代理模式允许你为其他对象提供一个代理,以控制对这个对象的访问。代理模式在不改变实际对象的情况下,可以在访问对象时添加额外的功能。

可以理解为代理模式为被代理对象创造了一个替身,调用者可以通过这个替身去实现这个被代理对象的功能,这个替身也可以为被代理对象增加功能

静态代理

定义

使用时候需要定义接口或者父类。 代理类和委托类有共同的父类或父接口。

案例

首先定义一个接口 ITeacherDao,并在这个接口中定义一个teacher()方法。

package Static;

public interface ITeacherDao {
    void teacher();
}

再写一个他的实现类,实现teacher()方法

package Static;

public class TeacherDao implements ITeacherDao{
    @Override
    public void teacher() {
        System.out.println("老师在教课");
    }
}

 如上,我们实现了一个简单接口与他的实现类,接下来我们实现一个老师的静态代理类

package Static;

public class TeacherDaoProxy implements ITeacherDao{

    private TeacherDao teacherDao;

    public TeacherDaoProxy(TeacherDao teacherDao){
        this.teacherDao = teacherDao;
    }
    @Override
    public void teacher() {
        System.out.println("代理前");
        teacherDao.teacher();
        System.out.println("代理后");
    }
}

在这段代码中,我们实现了TeacherDao的代理类,并通过调用teacherDao这个对象使用了被代理对象的方法;我们在使用被代理对象方法前后都拓展了新的功能,这就是静态代理。

下面是主函数对于静态代理的使用

public class Main {
    public static void main(String[] args) {
        Static.TeacherDao teacherDao = new TeacherDao();

        TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);

        teacherDaoProxy.teacher();
    }
}

Java代理模式——静态代理与动态代理,代理模式,java,设计模式,反射

 这说明我们的代理类在实现被代理对象的功能时也拓展了新的功能

但是,这样的模式也存在一种缺陷,就是我们的代理对象和被调用对象都要实现同一接口或父类,可能会出现多个代理类,接口如果要增加方法的话会有很多代理类需要维护;针对这一问题,Java的开发者定义了相关方法去解决,这就是我们下面要介绍的被代理类。

动态代理

定义

不需要实现接口,但是被代理的目标对象需要实现,调用jdk的api形成代理对象,

动态代理就是通过使用反射,动态地获取抽象接口的类型,从而获取相关特性进行代理。

案例

我们还是先定义一个接口

public interface ITeacherDao {
    void teacher();
    void sayhello();
}

接着我们定义他的实现类

public class TeacherDao implements ITeacherDao {
    @Override
    public void teacher() {
        System.out.println("老师在教课");
    }

    @Override
    public void sayhello() {
        System.out.println("hello");
    }
}

接着我们实现一个动态的代理类,可以动态代理原对象;在这个代理类中,我们使用到了Proxy.newProxyInstance 这个函数,他有三个参数,以下是三个参数的解释

1.target.getClass().getClassLoader():获取被代理对象的类加载器。这是用于加载代理类的类加载器。

2.target.getClass().getInterfaces():获取被代理对象实现的接口。这些接口是代理类将要实现的接口。

3.new InvocationHandler() { ... }:创建一个匿名的 InvocationHandler 对象,它实现了 invoke 方法,这是代理逻辑的核心部分。

 我们在InvocationHandler() { ... }中调用了被代理对象的方法,并且做了一些扩展

public class FactoryProxy  {
    private Object target;

    public FactoryProxy(Object target){
        this.target = target;
    }

    public Object getProxyIstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("代理前");
                Object returnVal = method.invoke(target,args);
                System.out.println("代理后");

                return returnVal;
            }
        });
    };
}

在主函数中调用被代理类,创建一个接口类,讲接口类传入被代理类,然后就可以定义接口类中的方法了,即实现了动态代理。

public class Main {
    public static void main(String[] args) {
        ITeacherDao iteacherDao = new TeacherDao();

        ITeacherDao proxyInstance = (ITeacherDao) new FactoryProxy(iteacherDao).getProxyIstance();

        proxyInstance.teacher();
        proxyInstance.sayhello();

    }
}

最终输出结果

Java代理模式——静态代理与动态代理,代理模式,java,设计模式,反射

 可以看出,我们通过动态代理类实现了对目标对象的功能拓展

链接

java静态代理与动态代理: java静态代理与动态代理文章来源地址https://www.toymoban.com/news/detail-646275.html

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

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

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

相关文章

  • Java设计模式(十三)代理模式

    一、概述 代理模式是一种结构型设计模式,它提供了一个代理对象,充当被代理对象的接口,以控制对被代理对象的访问。代理模式可以在不修改被代理对象的情况下,增加额外的功能或控制访问方式。 二、代码 以下是一个示例代码,说明代理模式的使用: 在上述代码中,

    2024年02月04日
    浏览(24)
  • 【Java设计模式005】代理模式

    由于一些特定原因某些对象不适合或者不能直接引用目标对象,这时就可以使用代理模式。代理模式为目标对象提供一个代理以控制访问对象对目标对象的访问。客户端只能直接访问代理对象,不能直接访问目标对象,这么做确保了目标对象的安全。生活中一个常见的例子就

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

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

    2024年02月11日
    浏览(29)
  • 设计模式-简单工厂模式(静态工厂模式)java实现

    简单工厂模式根据所 提供的参数 数据返回几个可能类中的一个类的实例。通常返回的类都有一个公共的父类和公共的方法。   意图 提供一个类,负责根据一定的条件创建某一具体类的实例。同时使用工厂模式也是为了隐藏创建对象的过程 角色及其职责 (1)工厂(Creator)角色

    2024年02月13日
    浏览(37)
  • Java设计模式---单例 工厂 代理模式

    单例模式是设计模式中的一种,属于创建型模式。在软件工程中,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于那些需要频繁实例化然后引用,且创建新实例的开销较大的类,例如数据库连接池、缓存管理等。 意图 :保证一个类仅有一个实例

    2024年01月24日
    浏览(39)
  • 基于Java的设计模式 - 代理模式

    代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式。简单来讲就是在不修改目标对象的基础上,增强主业务逻辑的设计模式。 代理模式基本可分为三种 静态代理 JDK动态代理 CGLIB动态代理 上述简单分就是静态和动态代理,静

    2024年02月07日
    浏览(28)
  • Java 与设计模式(13):代理模式

    代理模式是一种结构型设计模式,用于在访问对象时引入一个代理对象,以控制对实际对象的访问。代理对象充当了客户端和实际对象之间的中介,客户端通过代理对象间接地访问实际对象,从而可以在访问过程中添加额外的逻辑或控制。代理模式可以提供对实际对象的保护

    2024年02月09日
    浏览(27)
  • 设计模式8:代理模式-静态代理

    我尝试在JDK、Android SDK和一些出名的库中,寻找静态代理的源码,没能找到。如果有读者发现,欢迎评论或者私信我。 1. 售票代理 售票服务 站点售票 代理网点售票 2. 明星代理

    2024年02月11日
    浏览(24)
  • Java设计模式中的代理模式

    Java设计模式中的代理模式 代理模式是一种结构型设计模式,它提供了一个代理对象,以控制对其他对象的访问。代理可以充当中介,用于控制对真实对象的访问。 代码举例演示 静态代理: 动态代理 区别: 静态代理: 代理类在编译时就已经确定,并且需要为每个被代理的

    2024年01月25日
    浏览(31)
  • 【Java 设计模式】结构型之代理模式

    代理模式(Proxy Pattern)是一种结构型设计模式, 它允许通过一个代理对象控制对其他对象的访问 。代理模式在访问对象时引入了一定程度的间接性,使得可以在访问对象前后进行一些额外的操作。在本文中,我们将深入研究Java中代理模式的定义、结构、使用场景以及如何在

    2024年01月21日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包