0. 序言
何谓代理?让同事帮忙买饭,让律师帮忙打官司,让外卖小哥帮忙买饭,这些都是代理。
代理分为静态代理和动态代理两类。这一节我们讲解静态代理。
1. 定义
为其他对象提供一种代理以控制对这个对象的访问。
2. 场景
当无法或不想直接访问某个对象或访问某个对象存在困难时,可以通过一个代理对象来间接访问。为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。
3. UML
4.示例
- 抽象主题类
public abstract class Subject {
public abstract void visit();
}
- 实现抽象主题的真实主题类
public class RealSubject extends Subject {
@Override
public void visit() {
System.out.println("Real Subject");
}
}
- 代理类
public class ProxySubject extends Subject {
// 指向真实主题
private Subject mSubject;
public ProxySubject(Subject subject){
mSubject = subject;
}
@Override
public void visit() {
// 通过真实主体引用的对象调用真实主题的逻辑方法
mSubject.visit();
}
}
- 客户类
public class Main {
public static void main(String[] args) {
// 构造一个真是主题对象
RealSubject realSubject = new RealSubject();
// 通过真实主体对象构造一个代理对象
ProxySubject proxySubject = new ProxySubject(realSubject);
// 调用代理的相关方法
proxySubject.visit();
}
}
- 角色介绍
① 抽象主题
该类的主要职责是声明真实主体与代理的共同接口方法,该类既可以是一个抽象类,也可以是一个接口。
② 真实主题类
该类定义了代理所表示的真实对象,由其执行具体的业务逻辑方法,而客户类则通过代理类间接地调用真是主题类中定义的方法。
③ 代理类
该类持有一个指向真实主题类的引用,在其所实现的接口方法中调用真实主题中相应的接口方法执行,以此起到代理的作用。
④ Client:
客户类,即使用代理类的类。
5. 简单实现
就拿文章开头,让律师帮忙打官司的案例来简单实现下。
- 诉讼接口类
public interface ILawsuit {
// 提交申请
void submit();
// 进行举证
void burden();
// 开始辩护
void defend();
// 诉讼完成
void finish();
}
- 具体诉讼人
public class XiaoWang implements ILawsuit {
@Override
public void submit() {
System.out.println("诉讼申请");
}
@Override
public void burden() {
System.out.println("开始举证");
}
@Override
public void defend() {
System.out.println("开始辩护");
}
@Override
public void finish() {
System.out.println("诉讼完成");
}
}
- 代理律师
public class Lawyer implements ILawsuit {
private ILawsuit mLawyer;
public Lawyer(ILawsuit lawsuit){
mLawyer = lawsuit;
}
@Override
public void submit() {
mLawyer.submit();
}
@Override
public void burden() {
mLawyer.burden();
}
@Override
public void defend() {
mLawyer.defend();
}
@Override
public void finish() {
mLawyer.finish();
}
}
由上可见,静态代理:代理谁,就要看代理类中所持有的实际对象的类型。
6. 后续
如果大家喜欢这篇文章,欢迎点赞!
如果想看更多设计模式 方面的文章,欢迎关注!
你的点赞和关注,是对我莫大的支持和鼓励,我将会花更多的时间和精力在分享技术上!