介绍
代理(Proxy)模式属于对象结构型模式。为另一个对象提供一个替身或占位符以控制对这个对象的访问(摘自《Head First设计模式》)。
适用场景
代理模式使用的地方非常多,比如动态代理、比如VPN、RPC、RMI、AJAX之前的加载等待提示等。主要有以下三个用途:
- 远程代理控制访问远程对象,跨JVM
- 虚拟代理控制访问创建开销大的资源
- 保护代理基于权限控制对资源的访问
UML结构图:
场景模拟
当码农经验丰富起来之后,会专业的经纪人为你找合适的岗位,其实经纪人就是大家都熟悉的猎头了。也就是本文的主角:代理 。猎头在向企业HR推荐候选人的时候会隐藏求职者的联系方式,在交易成功的时候才会提供。这种代理属于保护代理。
代码实现
1.猎头,根据HR是否付款选择是否提供求职者的联系方式。即Proxy:
public class Hunter {
private Candidate candidate = new Candidate();
private boolean paid = false;
/**
* 获取求职者信息
* @return 简历信息
*/
public ResumeInfo getResumeInfo() {
ResumeInfo resumeInfo = new ResumeInfo(candidate.getResumeInfo().getBaseInfo(), candidate.getResumeInfo().getWorkExpInfo());
if (!paid) {
resumeInfo.setBaseInfo("暂时不可见!");
}
return resumeInfo;
}
/**
* 设置付款状态
* @param paid 是否已付款
*/
public void setPaid(boolean paid) {
this.paid = paid;
}
}
2.候选人,保存有全部的信息。即RealSubject:
public class Candidate {
public ResumeInfo getResumeInfo() {
String baseInfo = "刘世杰:TEL-13800138000,EMAIL-array7#mail.com";
String workExpInfo = "3年经验-精通26个字母、开关机、小九九等";
return new ResumeInfo(baseInfo, workExpInfo);
}
}
3.企业HR,筛选简历,即Client
public class Hr {
public boolean pushCandidate(ResumeInfo resumeInfo) {
System.out.println("求职者脱敏信息:" + resumeInfo.toString());
System.out.println("合格并已付款……");
return true;
}
public void fullResumeInfo(ResumeInfo resumeInfo) {
System.out.println("求职者完整信息:" + resumeInfo.toString());
}
public static void main(String[] args) {
Hunter hunter = new Hunter();
Hr hr = new Hr();
boolean paid = hr.pushCandidate(hunter.getResumeInfo());
hunter.setPaid(paid);
hr.fullResumeInfo(hunter.getResumeInfo());
}
}
4.输出
求职者脱敏信息:ResumeInfo{baseInfo='暂时不可见!', workExpInfo='3年经验-精通26个字母、开关机、小九九等'}
合格并已付款……
求职者完整信息:ResumeInfo{baseInfo='刘世杰:TEL-13800138000,EMAIL-array7#mail.com', workExpInfo='3年经验-精通26个字母、开关机、小九九等'}