【设计模式】结构型:代理模式,静态代理、动态代理(Proxy Pattern)

代理模式是什么

在公司上班,每月都要缴纳社保,你从来没有自己去社保中心缴纳过,都是由公司人力部门代你缴纳,人力小姐姐就是你的代理人,帮你做了这件事情。

火车票由铁路局印售,全国各地都有火车票代售点,你去最近的代售点就能买到你想要的车票,不用跑去铁路局,代售点就是铁路局的车票代理人,负责代理售卖火车票。

我具备做一件事情的能力,但是我不想和太多人直接打交道,就可以找个代理挡在我的前面,代替我和其他人交流,我只和代理交流,事情最终还是我来做,这就是代理模式。

代理模式应用到面向对象编程领域中,又可分为两个模式:静态代理、动态代理。最主要的区别:

  1. 静态代理:系统启动时,代理类就存在,是开发者自己编码出来的
  2. 动态代理:系统启动时,代理类不存在,是系统运行时动态生成的

代理模式的实现

静态代理

代理类要自己写,代码写着比较繁琐,但是运行时效率相对较高:

public interface Subject {
    void request();
}

// 被代理类
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("do something");
    }
}

// 代理类
public class RealSubjectProxy implements Subject {
    private final RealSubject subject;
    
    public RealSubjectProxy(RealSubject subject) {
        this.subject = subject;
    }
    
    @Override
    public void request() {
        System.out.println("proxy do something before");
        subject.request();
        System.out.println("proxy do something after");
    }
}

使用的时候,要先创建出静态代理类对象,然后再做代理的事情:

public static void main(String[] args) {
    Subject subject = new RealSubject();
    Subject proxy = new RealSubjectProxy(subject);
    proxy.request();
}

动态代理

这里使用JDK动态代理举例,代码写着比较方便,但是运行时效率相对较低:

public interface Subject {
    void request();
}

// 被代理类
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("do something");
    }
}

// 注意:这个类描述的是代理逻辑,不是代理类本身
public class ProxyLogic implements InvocationHandler {
   private final Object subject;

    public ProxyLogic(Object subject) {
        this.subject = subject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("proxy do something before");
        Object invoke = method.invoke(subject, args);
        System.out.println("proxy do something after");
        return invoke;
    }
}

使用的时候,要先调用JDK的方法生成动态代理类对象,再去做代理的事情:

public static void main(String[] args) {
    RealSubject subject = new RealSubject();
    Subject proxy = (Subject) Proxy.newProxyInstance(
            RealSubject.class.getClassLoader(),
            new Class[]{Subject.class},
            new ProxyLogic(subject)
    );
    System.out.println("系统生成的代理类: proxy = " + proxy.getClass());
    proxy.request();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值