理解设计模式之代理模式

本文介绍了代理模式的基本概念,包括静态代理和动态代理的区别,并通过具体的Java代码示例详细展示了这两种代理方式的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

为另一个对象提供一个替身或占位符以控制对这个对象的访问。

简要说明

简而言之我们在无法直接调用某个对象的时候,我们就可以通过它的代理对象进行访问。代理模式分为静态代理和动态代理,静态代理是代理对象和真实对象实现了同一个接口,代理对象里有真实对象的一个引用,我们在需要调用一个方法的时候是通过调用代理对象的方法,而不是直接调用真实对象的实现方法,在我们调用的代理对象的方法里通过引用调用了真实对象的实现方法。动态代理在程序运行时,运用反射机制动态创建而成。

对比

动态代理与静态代理对比:
每一个代理类只能为一个接口服务,一个AccountProxy 类实现了一个Account接口,那么我要是有多个接口,是不是要写多个Proxy类与之对应。这样一来程序开发中必然会产生过多的代理,而且,所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码。解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能,那就引入了我们的动态代理了。

关系图

这里写图片描述

举例说明

public interface IAcount{
    void printAccount();
}
//实际类
public class RealAccount implements IAccount{
    @Override
    public void printAccount(){
        //......
    }
}

1.静态代理举例

//静态代理类
public class ProxyAccount implements IAccount{
    private IAccount realAccount;
    @Override
    public void printAccount(){
        realAccount.printAccount();
    }
}

2.动态代理

//动态代理对象需要继承InvocationHandler接口
public class DynamicProxyObject implements InvocationHandler{
    private Object proxy;
    public DynamicProcyObject(Object proxy){
        this.proxy = proxy;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args){
        Object result = null;
         //在转调具体目标对象之前,可以执行一些功能处理
        if (args != null && args.length > 0) {
            for (Object obj : args) {
                System.out.print(obj + "---");
            }
        }
        //转调具体目标对象的方法
        result = method.invoke(this.proxy, args);
        return result;
    }
}
public class Test{
    public static void main(String[] args){
        IAccount proxy =(IAccount)Proxy.newProxyInstance(RealAccount.class.getClassLLoader(),
                                        RealObject.class.getInterfaces(),
                                        new DynamicProxyObject(new RealAccount()));
        proxy.printAccount();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值