美文网首页
设计模式——代理模式

设计模式——代理模式

作者: 笑对浮华 | 来源:发表于2023-10-06 16:35 被阅读0次

一、介绍

有些场景客户端和目标类之间无法直接建立联系,这时候需要一个中介来建立沟通的桥梁,代理模式可以用来处理这类问题。代理模式是系统通过代理类实现目标同样的功能,并且在实现功能之前和实现功能之后都能对业务进行拓展,实现在不修改目标类的基础上对系统进行拓展,遵循开闭原则。代理模式分为静态代理和动态代理两种方式。

二、静态代理

1、UML类图

静态代理

静态代理是指,代理类和目标类实现同一个接口,实现同样的方法,代理类持有目标类的对象引用,并在方法实现中调用目标类方法,在此基础上根据需要进行拓展。

2、代码实例

public interface IRentHouse {

    void rentHouse();
}
public class RentHouse implements IRentHouse{

    @Override
    public void rentHouse() {
        System.out.println("实现租房");
    }
}
public class IntermediaryProxy implements IRentHouse{

    private final IRentHouse mRentHouse;

    public IntermediaryProxy(IRentHouse rentHouse) {
        mRentHouse = rentHouse;
    }

    @Override
    public void rentHouse() {
        System.out.println("寻找中介代理");
        mRentHouse.rentHouse();
        System.out.println("中介后期房屋维护");
    }
}

在代理类中的rentHouse方法实现中调用了目标类的rentHouse方法,在调用目标类的方法之前和之后都可以根据业务需要对系统进行拓展。

3、小结

静态代理要求代理类和目标类必须实现同一个接口,当接口中定义的方法发生变化时,代理类和目标类都要做出相应的改变,代理模式存在诸多限制,平时开发中很少用到。

三、动态代理

动态代理不再要求代理类和目标类要实现同一个接口,动态代理通过Java反射机制来实现代理类一个方法对目标类多个方法的代理。动态代理又分为JDK动态代理(接口代理)CGlib动态代理

1、JDK动态代理

JDK动态代理主要是通过实现InvocationHandler接口,实现接口中定义的invoke方法来完成代理。代码实例如下:

public class JDKDynamicProxy implements InvocationHandler {

    private final Object bean;

    public JDKDynamicProxy(Object bean) {
        this.bean = bean;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String name = method.getName();
        switch (name){
            case "sound":
                System.out.println("叫声~");
                break;
            case "eat":
                System.out.println("吃饭~");
                break;
        }
        return method.invoke(bean,args);
    }
}

其中构造方法传入的Object对象就是要代理的目标类。

2、CGlib动态代理

CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理。项目中使用CGLIB动态代理需要引进cglib相应的依赖,主要是通过MethodInterceptor、Enhancer来实现。代码实例如下:

public class CglibProxy implements MethodInterceptor {

    private final Object bean;

    public CglibProxy(Object bean) {
        this.bean = bean;
    }

    public Object getProxy(){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(bean.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        String name = method.getName();
        switch (name){
            case "sound":
                System.out.println("叫声,此处拓展。。。");
                break;
            case "eat":
                System.out.println("吃饭,此处拓展。。。");
                break;
        }
        return method.invoke(bean,objects);
    }
}

四、总结

代理模式更注重与客户端和目标类之间的媒介作用,解决当客户端不便直接调用目标类时存在的问题;装饰器模式更注重对原生类功能的增加。装饰器模式中装饰类在继承目标类的同时还需要聚合目标类的引用,代理模式更多是通过反射机制来实现。

相关文章

  • Mybatis代理设计模式(Proxy)与编程实现原理

    最易懂设计模式解析适配器设计模式模板方法设计模式Mybatis多级代理 1. 认识代理模式 1.1 模式定义 给某...

  • 模板方法设计模式(Template Method)

    最易懂设计模式解析适配器设计模式Mybatis代理设计模式Mybatis多级代理 1. 认识模板方法模式 1.1 ...

  • 适配器设计模式(Adapter)

    最易懂设计模式解析模板方法设计模式Mybatis代理设计模式Mybatis多级代理 1. 认识适配器模式 1.1 ...

  • 理解java的代理模式和动态代理

    代理模式 代理模式是23种设计模式之一,属于结构型模式。代理模式是最常见也是最常用的模式之一,只不过有很多设计模式...

  • spring框架中的设计模式二

    在这篇文章中,介绍4种设计模式。结构型设计模式:代理和复合模式。行为型设计模式:策略和模板方法模式。 代理模式 面...

  • 10、结构型模式-代理设计模式

    1、加盟商来啦-你需要掌握的代理设计模式 简介:讲解代理设计模式,让代理帮你完成工作 代理设计模式(Proxy P...

  • 设计模式之代理模式

    设计模式之代理模式 10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理 仿JDK实现动态代理逻辑...

  • 动态代理原理解析

    注:源自于Android 一、代理模式 代理模式是java23种设计模式常用的一种设计模式。代理模式是客户端不直接...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • 前端设计模式

    JS设计模式一:工厂模式jS设计模式二:单例模式JS设计模式三:模块模式JS设计模式四:代理模式JS设计模式五:职...

网友评论

      本文标题:设计模式——代理模式

      本文链接:https://www.haomeiwen.com/subject/qsapbdtx.html