设计模式学习笔记二十一:代理模式
介绍
代理(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个字母、开关机、小九九等'}
 
                    
                     
                    
                 
                    
                
 
     
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号