一、类图
二、模式定义
代理模式:
给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
三、模式角色
(1) Subject(抽象主题角色):
它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。
(2) Proxy(代理主题角色):
- 它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;
- 在代理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实主题;
- 代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。
- 通常,在代理主题角色中,客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。
(3) RealSubject(真实主题角色):
它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。
四、代码示例
(1) Subject(抽象主题角色):
package com.yan.pattern.proxy;
public abstract class Subject {
public abstract void requset();
}
(2) Proxy(代理主题角色):
package com.yan.pattern.proxy;
public class Proxy extends Subject {
Subject subject = new RealSubject();
@Override
public void requset() {
requestBefore();
subject.requset();
requestAfter();
}
private void requestBefore() {
System.out.println("我是代理类的方法:我可以在调用真实对象 前 做一些事情,比如验证");
}
private void requestAfter() {
System.out.println("我是代理类的方法:我可以在调用真实对象 后 做一些事情,比如对数据进行处理");
}
}
(3) RealSubject(真实主题角色):
package com.yan.pattern.proxy;
public class RealSubject extends Subject{
@Override
public void requset() {
System.out.println("真正请求的地方");
}
}
(4)Client(客户端测试)
package com.yan.pattern.proxy;
public class Client {
public static void main(String[] args) {
Subject subject = new Proxy();
subject.requset();
}
}
(5)客户端测试结果
我是代理类的方法:我可以在调用真实对象 前 做一些事情,比如验证
真正请求的地方
我是代理类的方法:我可以在调用真实对象 后 做一些事情,比如对数据进行处理