首页 > 其他分享 >【设计模式】代理模式

【设计模式】代理模式

时间:2024-07-10 11:27:41浏览次数:6  
标签:对象 RealSubject request 代理 模式 realSubject 设计模式 public

代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理,以控制对这个对象的访问。代理模式通常用于延迟创建开销较大的对象,控制对对象的访问权限,或在访问对象时进行一些操作,如日志记录、性能监控等。

代理模式的分类

代理模式根据不同的应用场景,可以分为以下几类:

  1. 静态代理:在编译时由程序员手动创建或工具自动生成代理类。
  2. 动态代理:在运行时通过反射机制动态生成代理类。
  3. 保护代理:控制对原始对象的访问,适合对象有不同访问权限时使用。
  4. 虚拟代理:通过代理对象来控制对耗资源对象的访问,延迟实际对象的创建。
  5. 远程代理:为位于不同地址空间的对象提供局部代理对象,控制对远程对象的访问。

代理模式的结构

代理模式的关键在于代理类(Proxy)和被代理类(RealSubject)之间的关系。具体结构如下:

  1. Subject(主题)
    • 定义代理类和被代理类的共同接口,使得代理类可以作为被代理类的替代品。
  2. RealSubject(真实主题)
    • 实现具体的业务逻辑。
  3. Proxy(代理类)
    • 持有一个对真实主题的引用,并实现主题接口。
    • 控制对真实主题的访问,可以在调用真实主题的方法前后进行额外的操作。

代理模式的实现

以下是使用Java实现代理模式的详细代码示例。

1. 定义主题接口


public interface Subject {
    void request();
}

2. 实现真实主题类


public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

3. 实现代理类


public class Proxy implements Subject {
    private RealSubject realSubject;

    @Override
    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        System.out.println("Proxy: Logging request.");
        realSubject.request();
    }
}

4. 测试代理模式


public class ProxyPatternTest {
    public static void main(String[] args) {
        Subject proxy = new Proxy();
        proxy.request();
    }
}

运行结果:


Proxy: Logging request.
RealSubject: Handling request.

代理模式在Java中的应用

在Java中,代理模式有着广泛的应用,以下是一些常见的应用场景:

  1. Java RMI(远程方法调用)
    • 使用远程代理在不同的Java虚拟机之间进行方法调用。
  2. 动态代理
    • Java提供了动态代理机制,通过 java.lang.reflect.Proxy 类可以在运行时创建代理类。
  3. AOP(面向切面编程)
    • 通过代理模式实现方法的前置和后置处理,例如Spring AOP。

Android中的应用

在 Android 开发中,代理模式同样有着广泛的应用。例如:

  1. AIDL(Android Interface Definition Language)
    • AIDL 生成的代理类用于进程间通信(IPC),代理类在客户端与服务端之间传递消息。
  2. 动态代理
    • 使用动态代理实现 Retrofit 等网络请求库,生成网络请求接口的代理类,处理网络请求和响应

Java动态代理示例

使用Java的动态代理机制,可以在运行时创建代理对象,并在方法调用前后执行额外操作。


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

public interface Subject {
    void request();
}

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

public class ProxyHandler implements InvocationHandler {
    private Object realSubject;

    public ProxyHandler(Object realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Proxy: Logging request.");
        return method.invoke(realSubject, args);
    }
}

public class DynamicProxyTest {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Subject proxyInstance = (Subject) Proxy.newProxyInstance(
            realSubject.getClass().getClassLoader(),
            realSubject.getClass().getInterfaces(),
            new ProxyHandler(realSubject)
        );

        proxyInstance.request();
    }
}

运行结果:


Proxy: Logging request.
RealSubject: Handling request.

代理模式的优缺点

优点

  1. 隔离对象:代理模式在客户端和真实对象之间引入了代理对象,隔离了客户端和对象的耦合。
  2. 控制访问:代理对象可以在访问真实对象前后进行额外的操作,控制对真实对象的访问。
  3. 延迟加载:虚拟代理可以实现对象的延迟加载,减少系统资源的开销。

缺点

  1. 性能开销:引入代理对象会增加一定的性能开销,尤其是在使用动态代理时。
  2. 实现复杂:代理模式的实现相对复杂,可能会增加系统的复杂性。

总结

代理模式是一种非常实用的设计模式,通过在客户端和真实对象之间引入代理对象,可以实现对真实对象的访问控制、延迟加载、性能监控等功能。在实际开发中,合理地运用代理模式,可以提高代码的灵活性和可维护性,同时需要注意性能开销和实现复杂性的问题。希望本文的介绍能够帮助你更好地理解和应用代理模式。

标签:对象,RealSubject,request,代理,模式,realSubject,设计模式,public
From: https://blog.csdn.net/u010870679/article/details/140262178

相关文章

  • aop的几种动态代理以及简单案例(1)
    SpingAOP是通过动态代理模式实现的,具体有两种实现方式,一种是基于Java原生的动态代理,一种是基于cglib的动态代理。1.jdk动态代理1.1创建需要被代理的方法接口publicinterfaceTargetInteface{voidmethod1();voidmethod2();intmethod3(Integeri);}1.......
  • 《C++20设计模式》策略模式
    文章目录一、前言二、实现1、UML类图2、实现一、前言策略模式和状态模式实现方式一样,只是目的不同,如果会状态模式的这个也就可以随便看看啦。相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_modern_Cpp_20二、实现1、UML类图2、实现#in......
  • 《C++设计模式》状态模式
    文章目录一、前言二、实现一、UML类图二、实现一、前言状态模式理解最基本上的我觉得应该也是够用了,实际用的话,也应该用的是Boost.MSM状态机。相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_modern_Cpp_20二、实现一、UML类图二、实现#......
  • 《C++20设计模式》观察者模式
    一、前言观察者模式感觉真的很难,我这里就实现书上差不多的例子,供大家学习吧!相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_modern_Cpp_20二、实现这里说一下观察者模式是干什么的。在实际中很有用,比如以下的例子。当股票价格变化时,自动通知所有......
  • 代理模式的三种实现方式
    第一种:cglib动态代理首先创建一个接口,存放对象的共同行为然后创建一个对象接着去创建一个类,如果不是spring工程,还需要加入相应的jar包cglib然后去实现MethodInterceptor重写邻面的intercept方法需要写一个方法去获取动态代理对象,通过enhancer获取父类管理的对象然后设......
  • 第三章 设计模式(2023版本IDEA)
    学习目标3.1设计模式概述3.2软件可复用问题和面向对象设计原则一、软件可复用问题二、面向对象设计原则1.单一责任原则(SingleResponsibilityPrinciple,SRP)2.开放-封闭原则(Open-ClosedPrinciple,OCP)3.里氏替换原则(LiskovSubstitutionPrinciple,LSP)4.依赖倒......
  • 中介者模式(Mediator Pattern)
    中介者模式(MediatorPattern)定义又称为调解者模式,或调停者模式。中介者模式定义了一个中介对象来封装一系列对象之间的交互,使得这些对象不需要直接相互通信,而是通过与中介者进行通信。通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发......
  • 常用的设计模式
    常用设计模式1.单例模式立即加载实例化:饿汉式单例模式在类装载到JVM时就完成了实例化,也就是说,当类被加载到JVM时,单例对象就已经被创建出来了。这种方式也被称为“饱汉模式”或“静态常量方式”。线程安全:由于饿汉式单例模式在类加载时就完成了实例化,并且这个实例是静态的,......
  • Linux C++ 045-设计模式之工厂模式
    LinuxC++045-设计模式之工厂模式本节关键字:Linux、C++、设计模式、简单工厂模式、工厂方法模式、抽象工厂模式相关库函数:简单工厂模式基本简介从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模......
  • 设计模式探索:适配器模式
    1.适配器模式介绍1.1适配器模式介绍适配器模式(adapterpattern)的原始定义是:将一个类的接口转换为客户期望的另一个接口,适配器可以让不兼容的两个类一起协同工作。适配器模式的主要作用是把原本不兼容的接口,通过适配修改做到统一,使得用户方便使用。比如,万能充电器和多......