程序笔记   发布时间:2022-07-19  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了设计模式-代理模式大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

代理模式

定义:由于某些原因需要给某对象提供一个代理以控制该对象的访问

结构:

  • 抽象主题(Subject): 接口声明要实现的业务方法
  • 真实主题 (Real Subject): 实现抽象主题里的业务方法
  • 代理类(Proxy):提供了与真实主题相同的接口,它可以扩展、控制真实主题的功能。

代理模式的结构很简单,是通过继承抽象主题的代理类来包含真实主题,从而来实现对真实主题的访问。

设计模式-代理模式

代码示例:

public interface Ticket {

    void buyTicket();
}
public class OfficialTicket implements Ticket {
    @Override
    public void buyTicket() {
        System.out.println("官方途径购票");
    }
}
public class ProxyTicket implements Ticket {

    private OfficialTicket officialTicket=new OfficialTicket();

    @Override
    public void buyTicket() {
        System.out.println("我把钱给了去哪网,委托购票");
        officialTicket.buyTicket();
    }
}

测试代码:

public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
        ProxyTicket proxyTicket = new ProxyTicket();
        proxyTicket.buyTicket();

以上就是代理模式的实现,也可以说是静态代理

静态代理的局限性:

  1. 如果我们需要再增加一个需要代理的方法,那我们需要修改上面3个类,每个类都要加对应的逻辑。
  2. 如果我们想再代理一个其他的对象,也需要对代理类进行修改。

那么如果用动态代理实现上面的代码会怎么样呢?

Ticket类和OfficialTicket不变

public class TickeTinvocationHandler implements InvocationHandler {

    private Ticket ticket;

    public TickeTinvocationHandler(Ticket ticket) {
        this.ticket = ticket;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("我把钱给了去哪网,委托购票");
        method.invoke(ticket,args);
        return null;
    }
}

测试代码:

public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
     
        Ticket ticket = new OfficialTicket();
        //将操作者对象进行注入
        TickeTinvocationHandler handler = new TickeTinvocationHandler(ticket);
        //生成代理对象
        Ticket operationProxy = (Ticket) Proxy.newProxyInstance(ticket.getClass().getClassLoader(),
                ticket.getClass().geTinterfaces(), handler);
       operationProxy.buyTicket();
    }

此时如果我们想增加一个退票方法,如果用动态代理,那么只需要改动Ticket类和OfficialTicket类。

Cglib实现:

public class TicketMethodInterceptor implements MethodInterceptor {


    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("我把钱给了去哪网,委托购票");
        Object object = proxy.invokeSuper(obj, args);
        return object;
    }
}

测试代码:

 public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
        Enhancer enhancer = new Enhancer();
        // 设置enhancer对象的父类
        enhancer.setSuperclass(OfficialTicket.class);
        // 设置enhancer的回调对象
        enhancer.setCallBACk(new TicketMethodInterceptor());
        // 创建代理对象
        Ticket proxy= (Ticket)enhancer.create();
        // 通过代理对象调用目标方法
        proxy.buyTicket();
    }

返回目录

大佬总结

以上是大佬教程为你收集整理的设计模式-代理模式全部内容,希望文章能够帮你解决设计模式-代理模式所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。