iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java躲不过设计模式的坑之代理模式详解
  • 565
分享到

Java躲不过设计模式的坑之代理模式详解

2024-04-02 19:04:59 565人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言使用场景代码分析总结前言 设计模式在我看来更像是一种设计思维或设计思想,它就像《孙子兵法》一样,为你的项目工程提供方向,让你的项目工程更加健壮、灵活,延续生命力。本文即将分享

前言

设计模式在我看来更像是一种设计思维或设计思想,它就像《孙子兵法》一样,为你的项目工程提供方向,让你的项目工程更加健壮、灵活,延续生命力。本文即将分享的是设计模式的其中一种:代理模式。

代理模式

 通用官方定义:代理模式(Proxy Pattern) 是一种结构型设计模式,通过代理对象控制对原对象的访问,并允许在访问前或访问后做一些处理。

 简单理解就是给一个对象找了一个替代品,这个替代品得到原对象授权,可以拦截一些无效或低效的访问,从而使得原对象可以释放时间做自己的事情。这样替代品实现了自己价值,原对象也得到了解放,两全其美的选择!!

 代理主要分为以下几种类型

  •  静态代理:仅用于单个接口实现类,程序运行前已经存在。调用时需要传入具体实例,调用方可以直接获取具体实例。
  • 动态代理:可以服务多个接口实现类,可以在程序运行时,通过反射机制动态创建代理对象。

使用场景

既然这么说了,那就结合实际介绍几个,还不是轻松拿捏~

场景一:作为一个气血方刚的男青年,汽车总是绕不开的话题,那就先以汽车为例。

4s店或汽车厂家均可以出售汽车,对于购车消费者来说,可以直接去喜欢的汽车店去体验成品,不必跋山涉水的跨省或跨市去汽车厂家。有了4S店代理,可以节省消费者时间,更快体验到心仪的汽车,最终也是通过汽车厂家拿到成品;同时汽车工厂通过这些代理,可以更快售出汽车,可谓是一举两得。关系类图如下:

场景二:上面讲述的是静态代理的案例,再来一个最近实践的动态代理需求场景。

人力业务平台接入了不同客户,同时为了满足客户不同的接入需求,采用动态代理模式会为每个客户动态生成代理对象,比如需要提取客户A的简历数据,根据客户A的标识获取代理类并执行对应的实现逻辑,从而获取客户A的数据信息。关系如下

代码分析

 结合上述动态代理业务场景,按照UML类型进行代码设计,来演示下整体过程。首先将数据提取接口(IHandlerService)抽象出来,同时提供一个通用实现(HandlerServiceImpl)。



public interface IHandlerService {

    
    void handle();

    
    String print(String content);

    
    void setPrefix(String prefix);
}


@Service
public class HandlerServiceImpl implements IHandlerService {

    
    private String prefix = "default";

    @Override
    public void handle() {
        System.out.println("=======自定义实现类" + prefix + "======");
    }

    @Override
    public String print(String content) {
        System.out.println(prefix + " 实现类输出 -》" + content);
        return prefix + "success";
    }

    @Override
    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }
}

接下来创建个代理类,变量包含通用接口,也可以增加业务所需的其它变量。(java动态代理核心内容:InvocationHandler接口和Proxy类,代理对象在执行函数时,会通过InvocationHandler接口的invoke调用执行函数)具体代码如下

public class MultiDynamicProxy implements InvocationHandler {

    
    private static Map<String, IHandlerService> map = new HashMap<>();
    public static String key = "default";

    private void addElements(String key) {
        if (map.containsKey(key)) return;
        IHandlerService handlerService = new HandlerServiceImpl();
        handlerService.setPrefix(key);
        map.put(key, handlerService);
    }

    public static IHandlerService newInstance(IHandlerService handlerService) {
        MultiDynamicProxy handlerProxy = new MultiDynamicProxy(handlerService);
        // 抽象逻辑接口
        Class<IHandlerService> handlerServiceClass = IHandlerService.class;

        
        return (IHandlerService) Proxy.newProxyInstance(handlerServiceClass.getClassLoader(),
                new Class[]{handlerServiceClass}, handlerProxy);
    }

    public MultiDynamicProxy(IHandlerService handlerService) {
        map.put(key, handlerService);
    }
    
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("=====代理类执行====" + proxy.getClass().getSimpleName());
        Object invoke = method.invoke(getElement(), args);
        return invoke;
    }

    private IHandlerService getElement() {
        if (null == map.get(key)) {
            addElements(key);
        }
        return map.get(key);
    }

小编在每个环节都增加了日志输出,就很容易理解每个环节都做了哪些处理,日志内容请接着往下看

public static void main(String[] args) {
        IHandlerService handlerService = MultiDynamicProxy.newInstance(new HandlerServiceImpl());
        String s = handlerService.print("客户A");
        System.out.printf("执行结果 => " + s);
    }
    // 输出结果 
    // =====代理类执行====$Proxy0
    // default 实现类输出 -》客户A
    // 执行结果 => defaultsuccess

观察结果可以看出,执行的service实例确实为代理对象($Proxy0),后续可以动态接入客户实现,并注册到客户信息集合,当然,也可以对实现类进行扩展,但考虑到通用性,所以接口职责尽可能保持单一,避免业务交叉,造成后续的维护困难。

总结

以上就是本文所分享的全部内容,静态代理部分由于相对比较简单,就没写代码,主要是动态代理,理解上比较容易,但是具体的执行过程确实需要仔细分析,才能明白其实现原理。

代理模式确实对于目标对象有保护作用,也方便了目标对象的扩展,但凡事都有两面性,它也不是完美的,由于多了代理层,请求处理增加处理过程,进而会降低响应速度,同时也增加了系统复杂性,维护成本会有些增加。

没有最完美的设计模式,只有最适合业务场景的设计模式。

以上就是Java躲不过设计模式的坑之代理模式详解的详细内容,更多关于Java代理模式的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java躲不过设计模式的坑之代理模式详解

本文链接: https://www.lsjlt.com/news/167120.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java躲不过设计模式的坑之代理模式详解
    目录前言使用场景代码分析总结前言 设计模式在我看来更像是一种设计思维或设计思想,它就像《孙子兵法》一样,为你的项目工程提供方向,让你的项目工程更加健壮、灵活,延续生命力。本文即将分享...
    99+
    2024-04-02
  • Java设计模式之代理模式详解
    目录一、代理模式二、静态代理三、动态代理一、代理模式 代理模式就是有一个张三,别人都没有办法找到他,只有他的秘书可以找到他。那其他人想和张三交互,只能通过他的秘书来进行转达交互。这个...
    99+
    2024-04-02
  • Java设计模式之代理模式详细解读
    目录Java设计模式-代理模式什么是代理模式?代理模式-UML图:源代码:运行结果:总结:应用实例:优点:缺点:使用场景:Java设计模式-代理模式 什么是代理模式? 在代理模式(P...
    99+
    2024-04-02
  • Java设计模式之代理模式
    本文由老王出租房子引出——代理设计模式,将从最简单的静态代理实现开始,后延伸使用jdk实现动态代理,最后扩展到Cglib实现动态代理。为了更深入理解代理模式,...
    99+
    2024-04-02
  • Java设计模式之java迭代器模式详解
    目录前言介绍角色迭代器模式中的工厂模式学院遍历的案例分析解决方案基本介绍原理类图上面案例的类图案例实现代码案例总结应用实例Java集合中的迭代器模式角色说明Mybatis中的迭代器模...
    99+
    2024-04-02
  • 深入理解Java设计模式之代理模式
    目录一、引言二、什么是代理模式三、代理模式的结构四、代理模式和装饰模式的异同五、代理模式和委托六、代理模式的种类七、代理模式的应用场景八、代理模式的优缺点九、代理模式的实现总结一、引...
    99+
    2024-04-02
  • java设计模式学习之代理模式
    代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。代理模式结构图模拟需求:3班小张喜欢1班小红,但是不认识小红,委托1班小明送给小红礼物。创建一个小张和小明都能实现的接口。package ProxyModel;inter...
    99+
    2023-05-31
    java 设计模式 代理模式
  • java设计模式笔记之代理模式
    代理(Proxy)模式:代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。核心作用:通过代理,控制对对象的访问。可以详细控制访问某个(某类)对象的方法,在调用这个方法之前做前置处理,在调用这个方...
    99+
    2023-05-31
    java 设计模式 代理模式
  • Java设计模式之java组合模式详解
    目录引言组合模式介绍角色模式结构示例代码水果盘文件浏览更复杂的组合模式透明与安全透明组合模式安全组合模式组合模式总结优点缺点适用场景应用XML文档解析文件HashMapMybatis...
    99+
    2024-04-02
  • Java设计模式之java原型模式详解
    目录介绍角色Java语言提供的clone()方法代码演示—克隆羊结论深浅拷贝深浅拷贝探讨实现深克隆的方式一 : 手动对引用对象进行克隆实现深克隆的方式一 :序列化原型模式对单例模式的...
    99+
    2024-04-02
  • Java设计模式之java状态模式详解
    目录状态模式的结构状态模式的角色 示例代码适用场景投票案例认识状态模式状态和行为行为的平行性环境和状态处理对象状态模式优点状态模式的缺点状态模式和策略模式对比参考文章 总结...
    99+
    2024-04-02
  • Java设计模式之java策略模式详解
    目录为什么使用策略模式?策略模式包含角色策略模式的类图排序案例策略模式的优点策略模式的缺点适用场景源码分析策略模式的典型应用Java Comparator 中的策略模式参考文...
    99+
    2024-04-02
  • Java设计模式之java命令模式详解
    目录命令模式的介绍角色订单案例命令模式的优点适用场景示例代码应用宏命令----执行一组命令示例代码总结JDK源码解析 Runable是一个典型命令模式,Runnable担当命令的角色...
    99+
    2024-04-02
  • Java设计模式之java外观模式详解
    目录模式动机模式定义模式结构角色模式分析典型的外观角色代码外观模式实例与解析实例一:电源总开关实例二:文件加密模式优缺点优点缺点模式适用环境源码分析外观模式的典型应用(1) 外观模式...
    99+
    2024-04-02
  • Java设计模式之装饰模式详解
    目录一、装饰模式引入例子1.1 一般设计1.2 使用继承方式的一般设计存在的问题二、装饰模式2.1 装饰(Decorator)模式中的角色2.2 装饰模式改进设计UML2.3 装饰模...
    99+
    2024-04-02
  • Java设计模式之原型模式详解
    目录一、前言二、优点及适用场景三、原型模式的注意事项四、浅复制和深复制五、浅复制demo演示六、深复制demo演示一、前言 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口...
    99+
    2024-04-02
  • Java设计模式之java桥接模式详解
    目录一、什么是桥接模式:二、UML结构图:三、代码实现:四、JDBC源码解析-桥接模式:1、源码分析:2、源码类图:3、对 JDBC 的观点:参考博客:总结一、什么是桥接模式: 桥接...
    99+
    2024-04-02
  • Java设计模式--代理模式
    目录1、代码设计的代理模式2、计算机网络中的正向代理和反向代理总结1、代码设计的代理模式 代理模式属于构建型模式(Proxy),提供了对目标对象的一种访问方式; 即通过代理对象访问...
    99+
    2024-04-02
  • Java设计模式之命令模式详解
    命令模式 定义:将请求封装成对象,这可以让你使用不同的请求、队列、或者日志来参数化其他对象。 何时使用命令模式?当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式。 在被...
    99+
    2024-04-02
  • JAVA设计模式之单例模式详解
    目录前言一、单例模式是什么?二、懒汉式单例三、饿汉式单例四、双重校验锁总结前言 在之前的文章里已经介绍了设计模式以及设计原则的概念,接下来我们从单例模式入手深入学习几种常用的JAVA...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作