设计模式之代理模式

设计模式之代理模式

简介

​ 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能,这种类型的设计模式属于结构型模式。

代理模式通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端的请求转发给目标对象,同时可以在转发请求前后进行额外的处理。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

作用

代理模式是一种结构设计模式,它允许通过创建代理对象来控制对其他对象的访问。代理对象充当原始对象的接口,客户端通过代理对象间接地访问原始对象,并可以在访问过程中添加额外的逻辑或控制。

代理模式的主要目的是通过引入代理对象,为原始对象提供一层间接访问的方式,以实现对原始对象的控制、保护或增强。他的常用场景有以下几个:

1、远程代理:在分布式系统中,代理模式可用于代理远程对象。远程代理隐藏了远程对象的实际实现细节,使客户端可以像访问本地对象一样访问远程对象。如Dubbo的实现就是用到了代理模式。

2、动态代理:动态代理允许在运行时动态地创建代理对象,并动态地将方法调用分派到不同的处理器。它通过Java的反射机制实现,可以用于实现通用的代理逻辑,而无需为每个被代理的类单独创建代理。如Spring的AOP,就用到了动态代理。

3、缓存代理:缓存代理可以缓存原始对象的结果,以避免重复计算或访问资源。一般我们在用到缓存的时候,可以用这种模式。先访问代理对象,代理对象会去查询缓存,如果缓存中你没有,再去查询真实对象。

4、日志代理:这种用的也挺多的,当我需要做日志记录的时候,可以做一个代理,在代理对象中进行统一的日志记录及管理。

5、异常代理:通常我们的系统中如果有统一的异常机制或者ERROR_CODE的机制,可以通过创建一个统一的代理来做处理。在代理对象中这些异常的捕捉及转换。

示例

假设我们有一个比较耗时的查询服务,他的接口定义及实现如下:

public interface DataService {
    String getData();
}
public class DataServiceImpl implements DataService {
    @Override
    public String getData() {
        //执行非常耗时的数据查询
        return "Data from expensive operation";
    }
}

这时候我们想要引入缓存,则可以定义以一个代理:

public class CachedDataServiceProxy implements DataService {
    private DataService dataService;
    @Autowired
    private CacheService cacheService;

    public CachedDataServiceProxy(DataService dataService) {
        this.dataService = dataService;
    }

    @Override
    public String getData() {
        //先从缓存中获取
        String cachedData = cacheService.getdata();
        //缓存中没有,则查询接口
        if (cachedData == null) {
            
            data = dataService.getData();
            //获取到以后再保存到缓存中
            cacheService.putData(data);
        }
        return cachedData;
    }
}

测试

public static void main(String[] args) {
    DataService dataService = new DataServiceImpl();
    DataService cachedDataService = new CachedDataServiceProxy(dataService);
   
    cachedDataService.getData();
}
代理模式是一种结构型设计模式,它提供一个代理对象来代表另一个对象。在代理模式中,有一个被称为实际对象(Subject)和一个被称为代理对象(Proxy)的中介,代理对象持有实际对象的引用,并且可以控制对实际对象的访问。代理模式的主要目的是在不修改原始对象的情况下,为原始对象添加额外的逻辑处理。 代理模式分为多种类型,如远程代理、虚拟代理、保护代理等,它们各自有不同的应用场景: - 远程代理:为远程对象提供一个本地代表。 - 虚拟代理:根据需要创建开销大的对象,通过虚拟代理控制访问这些对象的过程。 - 保护代理:控制对原始对象的访问权限,例如进行权限检查。 代理模式的优点包括: 1. 能够控制对真实对象的访问,并在访问前后添加额外的逻辑。 2. 可以通过代理对象实现延迟加载,即在实际需要时才创建真实对象。 3. 增强了对真实对象的封装,并且可以避免对真实对象的重复引用。 在C#中实现代理模式通常涉及以下步骤: 1. 定义一个接口或抽象类,声明真实对象和代理对象需要实现的方法。 2. 实现真实对象的类,按照接口或抽象类的要求实现具体方法。 3. 实现代理类,它同样实现接口或抽象类,并在方法中持有真实对象的引用,通过调用真实对象的方法来执行所需的操作,同时可以添加额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值