什么是静态代理?

什么是静态代理?

认识代理模式

代理模式分为动态代理和静态代理。两者的差别还是很大的,不过思想都是一样的,起到一个服务中介的作用。在这里我通过结婚为例进行演示代理模式。

我们结婚一般是找婚庆公司帮我们筹备举办,真实结婚的人是我,婚庆公司就是帮助我们结婚。下面我们就使用一张图来直观的表示一下:

在这里插入图片描述
从上图我们能够看出,代理模式其实特别的简单,我们想要结婚,请婚庆公司来帮忙。婚庆公司就是代理。结婚整个流程就是代理模式的应用。

思想我想大家都已经能够明白了,下面看一下类图,再从类的角度分析一下代理模式:

在这里插入图片描述

-表示private  
#表示protected 
~表示default,也就是包权限  
_下划线表示static  
斜体表示抽象  
+表示public

从上面这张图我们可以看到,一共有四个角色:

(1)StacticProxy:相当于用户类,调用代理结婚
(2)Person(结婚的人):是真正结婚的人
(3)HunQinGongSi(婚庆公司):帮助结婚的中介
(4)Marry(抽象对象接口):这里定义了结婚的人想要让婚庆公司做的事,结婚

对代理模式的基本思想有了认识之后,我们就可以好好看看静态代理模式是如何实现的了。

静态模式代码实现

静态代理: 所谓静态代理也就是在程序运行前就已经存在代理类的字节码文件(在真正结婚之前,就已经做好了相关工作,婚庆公司和结婚的人就做好了相关联系)。代理模式就是在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。简单来说静态代理就是在不改变源代码的基础上增加新的功能。

public class StacticProxy {
    public static void main(String[] args) {
        new HunQinGongSi(new Person()).HappyMarry();
    }
}

interface Marry{
    void HappyMarry();
}

//真实角色,真正结婚的对象
class Person implements Marry{
    @Override
    public void HappyMarry() {
        System.out.println("战神要结婚了");
    }
}

//代理角色,帮助对象结婚
class HunQinGongSi implements Marry{

    private Marry target;
    public HunQinGongSi(Marry target){
        this.target=target;
    }

    @Override
    public void HappyMarry() {
        before();
        this.target.HappyMarry();
        after();
    }

    private void before() {
        System.out.println("结婚前准备离婚材料");
    }

    private void after() {
        System.out.println("结婚后准备离婚");
    }
}

打印结果:

在这里插入图片描述

总结

代理模式就是这么简单,如果还不理解,动手敲一遍代码就清楚了。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
动态代理和静态代理的区别在于代理类的生成时机不同。静态代理是在编译期间就已经确定代理类,而动态代理是在运行时动态生成代理类。 动态代理的实现需要借助Java反射机制,可以在运行时动态地创建代理类和代理对象,无需手动编写代理类。相比之下,静态代理需要手动编写代理类,增加了代码量和维护成本。 另外,动态代理可以代理任意一个实现了接口的类,而静态代理只能代理固定的接口或类。因此,动态代理具有更强的灵活性和扩展性。 下面是一个简单的动态代理示例,用于代理一个实现了Calculator接口的类: ```python import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Calculator { int add(int a, int b); } class CalculatorImpl implements Calculator { public int add(int a, int b) { return a + b; } } class CalculatorProxy implements InvocationHandler { private Object target; public CalculatorProxy(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before method " + method.getName()); Object result = method.invoke(target, args); System.out.println("After method " + method.getName()); return result; } } public class Main { public static void main(String[] args) { Calculator calculator = new CalculatorImpl(); Calculator proxy = (Calculator) Proxy.newProxyInstance( calculator.getClass().getClassLoader(), calculator.getClass().getInterfaces(), new CalculatorProxy(calculator)); int result = proxy.add(1, 2); System.out.println("Result: " + result); } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值