设计模式——代理模式

简介: 一文讲清楚设计模式中的代理模式

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。

最近在学习的时候,突然看到了代理模式。一看就很熟悉,因为在spring中大量用到了代理模式。那接下来将结合查询到的资料和代码,分享一下代理模式的分类和实现,以及golang版本的。

先来看下代理模式的类图,拒绝乱七八糟的文字

代理模式

很简单,就是在一个接口的实现类方法处理逻辑中执行其他的逻辑。一分析,重点来了!如何获得接口实现类方法

静态代理

很简单的一种方式就是我再写一个类,直接把原有的方法调用一遍,不同的是我现在混杂了新逻辑,三方使用的话,也是调用我的新代码逻辑。

相信接下来的代码大家一看就明白,我就直接贴上代码了:

java实现

java版本代理模式

同样我们改造一下,就是go的实现:

go版本

import "fmt"

// Subject 接口定义了需要被代理的对象的方法
type Subject interface {
   
   
    Request() string
}

// RealSubject 是需要被代理的对象
type RealSubject struct{
   
   }

func (r *RealSubject) Request() string {
   
   
    return "RealSubject: 处理请求"
}

// Proxy 是代理对象,它包含了一个指向 RealSubject 的引用
type Proxy struct {
   
   
    realSubject *RealSubject
}

func (p *Proxy) Request() string {
   
   
    // 在这里可以进行一些额外的操作,例如鉴权、日志等
    result := "Proxy: 转发请求到 RealSubject\n"
    if p.realSubject == nil {
   
   
        p.realSubject = &RealSubject{
   
   }
    }
    result += " " + p.realSubject.Request()
    return result
}

// 使用代理模式来使用 RealSubject 对象
func main() {
   
   
    // proxy := &Proxy{}
    // fmt.Println(proxy.Request())

    realSubject := &RealSubject{
   
   }
    fmt.Println(realSubject.Request())
}

注:代码和文章参考:

动态代理

官方一点的话术是这样的:由于静态代理只能够对一种类型(接口)进行代理,如果想要对多种类型进行代理的话就需要创建多个代理类,为了弥补了静态代理的不足,从而出现了动态代理,使用反射技术实现。

我直接表示看不懂,直呼看不懂。

来点简单的,我直接放代码吧:

简单的代码结构

关键点在于我的Proxyfactory:

public class ProxyFactory {
   
   

    public <T> SmsService getProxyObject(T target) {
   
   
        /**
         * ClassLoader loader, 类加载器,加载代理类
         * Class<?>[] interfaces, 真实对象实现接口
         * InvocationHandler h 代理对象处理的函数
         */
        if (target instanceof SmsService) {
   
   
            return (SmsService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
   
   
                @Override
                public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
   
   
                    System.out.println("开始代理");
                    Object result = method.invoke(target, objects);
                    System.out.println("代理结束");
                    return result;
                }
            });
        } else {
   
   
            throw new IllegalArgumentException("Target object must implement the specified interface");
        }
    }

}

函数的参数target就是需要代理的对象。这里可以封装成一个统一的工具类,先不做展示了。

代码的调用方面:

public class MainMethod {
   
   

    public static void main(String[] args) {
   
   
        // 生成新对象
        PhoneSmsService phoneSmsService = new PhoneSmsService();
        PcSmsService pcSmsService = new PcSmsService();

        ProxyFactory proxyFactory = new ProxyFactory();
        SmsService PhoneProxyObject = proxyFactory.getProxyObject(phoneSmsService);
        SmsService pcProxyObject = proxyFactory.getProxyObject(pcSmsService);

        PhoneProxyObject.send();
        pcProxyObject.send();
    }

}

运行结果:

运行结果

所以对比之下,动态代理的优点就很明显了:

  1. 简化开发:相比静态代理,动态代理可以减少重复代码;
  2. 更灵活:动态代理可以在运行时动态地创建代理对象,可以应用于更广泛的场景。

在此,设计模式的学习+1。

与shigen一起,每天不一样!

目录
相关文章
|
5月前
|
设计模式 缓存 监控
【设计模式系列笔记】代理模式
代理模式是一种结构型设计模式,它允许一个对象(代理对象)控制另一个对象的访问。代理对象通常充当客户端和实际对象之间的中介,用于对实际对象的访问进行控制、监控或其他目的。
76 1
|
5月前
|
设计模式 缓存 安全
小谈设计模式(8)—代理模式
小谈设计模式(8)—代理模式
|
19天前
|
设计模式 缓存 安全
设计模式——代理模式
静态代理、JDK动态代理、Cglib 代理
设计模式——代理模式
|
7天前
|
设计模式 Java 数据安全/隐私保护
Java设计模式-代理模式(7)
Java设计模式-代理模式(7)
|
5月前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
52 1
|
5月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
2月前
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
2月前
|
设计模式
设计模式的基础问题之代理模式在工作中的问题如何解决
设计模式的基础问题之代理模式在工作中的问题如何解决
|
3月前
|
设计模式 算法 Go
iLogtail设计模式问题之代理模式在iLogtail中是如何应用的
iLogtail设计模式问题之代理模式在iLogtail中是如何应用的
|
3月前
|
设计模式 缓存 JavaScript
js设计模式【详解】—— 代理模式
js设计模式【详解】—— 代理模式
27 0