代理模式
概念
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过12306网站或者去火车票代售点买。
代理模式是一种结构型设计模式,它能够提供对象的替代品。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。
代理模式结构
代理模式的主要角色如下:
- 抽象Service类:通过接口或抽象类,声明被代理对象和代理对象实现的业务方法。
- 真实Service类:实现了抽象Service中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
- 代理(Proxy)类:提供了与真实Service相同的接口,其内部含有对真实Service的引用,它可以访问、控制或扩展真实Service的功能。
代理模式实例
抽象Service
package proxy;
/**
* 服务接口
* 代理必须遵循该接口,才能伪装成被代理对象。
*/
public interface ServiceInterface {
/**
* 提供服务
*/
void provideService();
}
被代理对象
package proxy;
/**
* 提供实用的业务逻辑
*/
public class Service implements ServiceInterface{
@Override
public void provideService() {
System.out.println("被代理对象:Service类运行业务逻辑!");
}
}
代理
package proxy;
/**
* 代理类
* 包含一个指向服务对象的【引用成员变量】
* 代理完成其任务(如延迟初始化、记录日志、访问控制和缓存等)后,会将请求传递给服务对象
* 通常情况下,代理会对其服务对象的整个生命周期进行管理。
*/
public class Proxy implements ServiceInterface {
// 被代理对象
private Service service;
@Override
public void provideService() {
if (service == null) {
service = new Service();
}
preProcess();
service.provideService();
postProcess();
}
public void preProcess() {
System.out.println("访问Service对象前,代理进行预处理!");
}
public void postProcess() {
System.out.println("访问Service对象后,代理进行后续处理!");
}
}
客户
package proxy;
/**
* 客户端
* 能通过同一接口与服务或代理进行交互,所以可在一切需要服务对象的代码中使用代理。
*/
public class Client {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.provideService();
}
}
输出结果:
访问Service对象前,代理进行预处理!
被代理对象:Service类运行业务逻辑!
访问Service对象后,代理进行后续处理!