Java中的代理模式(一)

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

大家好👋,我是极客涛😎,今天我们聊一聊java中的代理模式,话不多说,还是老思路,什么是代理模式,为什么要有代理模式,如何实现代理模式

代理模式

在说java中的代理模式之前,我们可以先想一想生活的例子,这里也是一个加深自己对程序设计理解的一种学习方式,程序本质上就是对生活的抽象和实现。

生活中的代理模式太多了:

  • 我想租房,不需要自己去网上搜,找个中介,把需求讲清楚,房子就找好了
  • 我想吃饭,点个外卖外卖员就送上门了,我就可以直接吃了,不用自己去拿

这里如果我们进行抽象的话,对于租房来说,我本身只有判断房子适不适合我的能力,但是我没有(不想)对房源进行检索的能力,这时候中介其实就是代理了我对房源进行检索,但最终房子适不适合还是我自己决定;对点外卖来说,我不想自己去店里拿,所以外卖小哥代理了我帮把饭送到我手上,我自己用吃的能力。

也就是说,代理模式的核心就是对被代理对象的能力拓展。

代理方式

静态代理

我们拿我吃饭的场景举例说明

  • 定义一个Person接口,有吃的能力
  • 定义实现类GeekTao,代表我自己,实现了吃的能力
  • 定义实现类Taker,代表外卖员,外卖员除了有吃的能力,自己还有送外卖的专属能力
/**
 * 人
 */
public interface Person {
    /**
     * 吃
     */
    void eat();
}

/**
 * 我
 */
public class GeekTao implements Person {

    @Override
    public void eat() {
        System.out.println("我自己吃饭");
    }
}

/**
 * 外卖员
 */
public class Taker implements Person {

    private final Person me;

    public Taker() {
        me = new GeekTao();
    }

    @Override
    public void eat() {
        // 送外卖
        this.send();
        // 吃饭
        me.eat();
    }

    private void send() {
        System.out.println("外卖员把外卖送到家");
    }
}

测试方法

public class ProxyTest {
    public static void main(String[] args) {
        Person taker = new Taker();
        taker.eat();
    }
}

运行结果

外卖员把外卖送到家
我自己吃饭

真好,现在可以不用自己去拿外卖,外卖小哥就把外卖送到了;还有个问题,吃完我又口渴了,如果我还想喝,抽象一个drink方法,外卖小哥是不是还得实现一个drink方法?下边做个简单示例。

/**
 * 外卖员
 */
public class Taker implements Person {

    private final Person me;

    public Taker() {
        me = new GeekTao();
    }

    @Override
    public void eat() {
        // 送外卖
        this.send();
        // 吃饭
        me.eat();
    }

    private void send() {
        System.out.println("外卖员把外卖送到家");
    }

    @Override
    public void drink() {
        // 送外卖
        this.send();
        // 喝水
        me.drink();
    }
}

以上实现其实就是静态代理,核心在于“静态”,对于我来说外卖小哥要实现一次,除了我还有很多人也需要点外卖,那外卖小哥每个都要适配一次;每次我自己有了新的需求(方法),外卖小哥也要跟着实现,但其实对于他来说实现方法都一样(都是送外卖),所以这也是静态代理的缺点,非常不灵活。

动态代理

还是拿我吃饭的场景举例子,上边说到外卖小哥不只是给我送外卖,那如何实现一个小哥可以给不同的人送外卖呢?

  • 定义一个Person接口,有吃的能力
  • 定义实现类GeekTao,代表我自己,实现了吃的能力
  • 定义实现类XiaoMing,也实现了吃的能力,也需要点外卖
  • 定义实现类TakerCommon,代表外卖员,外卖员除了有吃的能力,自己还有送外卖的专属能力,并且不只是可以给我送外卖,还可以给其他人送

其它类和上边例子一样,只贴了TakerCommon。

/**
 * 通用外卖员
 */
public class TakerCommon implements InvocationHandler {

    private Object proxyTarget;

    public Object sendWho(Object target) {
        this.proxyTarget = target;
        return Proxy.newProxyInstance(proxyTarget.getClass().getClassLoader(), proxyTarget.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("外卖员送外卖给 " + proxyTarget.getClass().getSimpleName());
        return method.invoke(proxyTarget, args);
    }
}

测试方法

public class ProxyTest {
    public static void main(String[] args) {
        TakerCommon takerCommon = new TakerCommon();

        Person me = (Person) takerCommon.sendWho(new GeekTao());
        me.eat();

        System.out.println("========================");

        Person xiaoming = (Person) takerCommon.sendWho(new XiaoMing());
        xiaoming.eat();
    }
}

测试结果

外卖员送外卖给 GeekTao
我自己吃饭
========================
外卖员送外卖给 XiaoMing
小明吃饭

这时候我又想喝,那直接调用drink方法就行了,因为对于外卖小哥来说都是一样的。

测试方法

public class ProxyTest {
    public static void main(String[] args) {
        TakerCommon takerCommon = new TakerCommon();

        Person me = (Person) takerCommon.sendWho(new GeekTao());
        me.eat();
        me.drink();

        System.out.println("========================");

        Person xiaoming = (Person) takerCommon.sendWho(new XiaoMing());
        xiaoming.eat();
        xiaoming.drink();
    }
}

测试结果

外卖员送外卖给 GeekTao
我自己吃饭
外卖员送外卖给 GeekTao
我自己喝
========================
外卖员送外卖给 XiaoMing
小明吃饭
外卖员送外卖给 XiaoMing
小明在喝

总结

代理模式的核心就是对被代理对象的能力拓展

静态代理适合简单业务,不经常变动,因为实现逻辑简单,开发成本低

动态代理适合变动可能性较大的业务。文章来源地址https://www.toymoban.com/news/detail-821808.html

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

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

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

相关文章

  • BCSP-玄子Share-Java框基础_工厂模式/代理模式

    软件设计中的 三十六计 是人们在长期的软件开发中的经验总结 是对某些特定问题的经过实践检验的特定解决方法 被广泛运用在 Java 框架技术中 3.1.1 设计模式的优点 设计模式是可复用的面向对象软件的基础 可以更加简单方便地复用成功的设计和体系结构 帮助开发者做出有

    2024年02月10日
    浏览(46)
  • 【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    代理模式(Proxy Pattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源

    2023年04月25日
    浏览(89)
  • 【Java基础教程】(十五)面向对象篇 · 第九讲:抽象类和接口——定义、限制与应用的细节,初窥模板设计模式、工厂设计模式与代理设计模式~

    掌握 抽象类和接口的定义、使用、区别、常见设计模式; 抽象类是代码开发中的重要组成部分,利用抽象类可以明确地定义子类需要覆写的方法,这样相当于在语法程度上对子类进行了严格的定义限制,代码的开发也就更加标准。下面具体介绍抽象类的概念。 普通类可以直

    2024年02月16日
    浏览(48)
  • Java代理模式——静态代理与动态代理

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

    2024年02月13日
    浏览(47)
  • 【Java基础教程】(十八)包及访问权限篇 · 下:Java编程中的权限控制修饰符、单例设计模式 (Singleton)和多例设计模式的综合探析~

    掌握Java 中的4种访问权限; 掌握Java 语言的命名规范; 掌握单例设计模式与多例设计模式的定义结构; 对于封装性,实际上之前只详细讲解了 private , 而封装性如果要想讲解完整,必须结合全部4种访问权限来看,这4种访问权限的定义如下表所示。 范围 private default protected

    2024年02月16日
    浏览(48)
  • Java设计模式(十三)代理模式

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

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

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

    2024年02月12日
    浏览(41)
  • 基于Java的设计模式 - 代理模式

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

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

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

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

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

    2024年01月24日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包