java设计模式——结构型模式——代理模式

本文介绍了代理模式的概念,包括静态代理、JDK动态代理和CGLIB动态代理的实现,以火车站买票为例展示了代码实现。代理模式在业务代码和目标对象间起到中介作用,允许扩展功能并降低耦合度,但也会增加系统复杂度。
摘要由CSDN通过智能技术生成

结构型模式——代理模式

代理模式概述

在代理模式中,业务层代码不会直接饮用目标对象,而是会提供一个代理对象作为业务层代码和目标对象之间的中介。
在java中,代理类按照生成的时间不同分为静态代理和动态代理。静态代理是指代理类在编译期就生成,而动态代理是指在java程序运行时动态生成。动态代理又分为jdk动态代理和cglib动态代理。

代理模式的结构

在代理模式中主要包括以下角色:

  • 抽象主题类:通过接口和抽象类声明真实主题和代理对象是想的业务方法。
  • 真实主题类:实现了抽象主题类中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
  • 代理类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制和扩展真实主题的功能。

代理模式的实现

以火车站买票为例分别展示三种代理模式的代码实现
静态代理
在有业务层程序需要火车票时,只需要调用代理类的方法。由下述代码可以看出来,代理类只是调用了真实主题类中的方法,完成抽象主题类中的方法。但是在代理类调用真实主题类的方法时,可以添加其他的功能。这里*System.out.println(“通过代理点卖票”);*就相当于添加的功能。

/**
 * SellTickets是抽象主题类
 */
public interface SellTickets {
    void sell();
}

/**
 * TrainStation是真实主题类
 */
public class TrainStation implements SellTickets{
    @Override
    public void sell() {
        System.out.println("火车站买票");
    }
}

/**
 * ProxyPoint是代理类
 */
public class ProxyPoint implements SellTickets{

    private TrainStation trainStation = new TrainStation();

    @Override
    public void sell() {
        System.out.println("通过代理点卖票");
        trainStation.sell();
    }
}

jdk动态代理
使用jdk动态代理的方式,是在程序运行时,调用动态的生成某个真实主题类的一个代理类。在代理类中实现了调用真实主题类中的具体方法实现了抽象主题类(接口)中的方法,并可以进行扩展。

public class JDKProxy {
    private TrainStation trainStation = new TrainStation();

    public SellTickets getProxyObject(){
        SellTickets sellTickets = (SellTickets) Proxy.newProxyInstance(trainStation.getClass().getClassLoader(),
                trainStation.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("通过jdk代理卖票");
                        Object result = method.invoke(trainStation,args);
                        return result;
                    }
                });
        return sellTickets;
    }
}

cglib动态代理
在引入cglib依赖后,可以使用cglib在程序运行时动态的生成代理类,在jdk动态代理中必须有一个抽象主题类(接口),因为jdk动态代理中其实是生成了一个实现这些接口的代理类。而在cglib代理中,不需要这样的接口,只需要有具体主题类就可以,因为cglib其实是生成了一个具体主题类的子类。

public class CglibProxy implements MethodInterceptor{
    private TrainStation trainStation = new TrainStation();
    public TrainStation getProxyObject(){
        Enhancer enhancer =new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        TrainStation obj = (TrainStation) enhancer.create();
        return obj;
    }
    public TrainStation intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { 
        System.out.println("代理点收取一些服务费用(CGLIB动态代理方式)");  
        TrainStation result = (TrainStation) methodProxy.invokeSuper(o, args); 
        return result;
    }
}

代理模式优缺点

优点:代理模式在业务成代码和目标对象之间起到了一个中介作用,可以保护目标对象,同时可以进行一定功能的扩展,降低了耦合度。
缺点:增加了系统的复杂度。

文章内容为个人学习总结,如有错误望指正。
参考链接https://www.bilibili.com/video/BV1Np4y1z7BU

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值