设计模式学习笔记二十一:代理模式

介绍

代理(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个字母、开关机、小九九等'}
posted @ 2015-09-08 01:26  土豆条  阅读(189)  评论(0编辑  收藏  举报