您的位置:首页 > 游戏 > 手游 > 盐城优化办_装修公司名字大全参考免费_成都网站搜索排名优化公司_网络公司优化关键词

盐城优化办_装修公司名字大全参考免费_成都网站搜索排名优化公司_网络公司优化关键词

2024/12/26 10:01:39 来源:https://blog.csdn.net/qq_68883928/article/details/144137060  浏览:    关键词:盐城优化办_装修公司名字大全参考免费_成都网站搜索排名优化公司_网络公司优化关键词
盐城优化办_装修公司名字大全参考免费_成都网站搜索排名优化公司_网络公司优化关键词

设计模式之代理模式

简介

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

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

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

作用

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

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

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

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

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

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

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

示例

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

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

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

public class CachedDataServiceProxy implements DataService {private DataService dataService;@Autowiredprivate CacheService cacheService;public CachedDataServiceProxy(DataService dataService) {this.dataService = dataService;}@Overridepublic 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();
}

动态代理

这是一个支付接口

public interface PayMent {void pay(int mount);
}

接口功能实现类

public class RealPayment implements PayMent{/*** 实现类* @param mount*/@Overridepublic void pay(int mount) {System.out.println("***pay monery :"+mount);}
}

动态代理类

/*** 动态代理类*/
public class PayProxy implements InvocationHandler {/*代理对象持有类*/private Object realObject;public PayProxy(Object realObject){this.realObject = realObject;}/**** @param proxy 代理对象本身* @param method 方法名、返回类型、参数类型* @param args 传递给方法的参数数组* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("invoke is start"); final Object invoke = method.invoke(realObject, args);System.out.println("invoke is end");return invoke;}public static Object getProxyInstance(Object realObject){return Proxy.newProxyInstance(realObject.getClass().getClassLoader(),realObject.getClass().getInterfaces(),new PayProxy(realObject));}
}

测试

public class demo {public static void main(String[] args) {final PayMent payMent =(PayMent)PayProxy.getProxyInstance(new RealPayment());payMent.pay(100000);}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com