zoukankan      html  css  js  c++  java
  • 设计模式学习笔记二十一:代理模式

    介绍

    代理(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个字母、开关机、小九九等'}
    
  • 相关阅读:
    Arthas线上问题排查
    如何快速增加pdf书签,解除pdf限制
    数组指针——指向数组的指针(通过指针控制数组)
    指针和数组直接对应关系之如何记忆
    C/C++语言中指针数组和数组指针比较区别
    int最大值+1为什么是-2147483648最小值-1为什么是2147483647
    电脑进行二进制加减运算方法
    C/C++语言中的函数参数传参三种对比
    Python基于VS2013 开发环境搭建 Hello World 10分钟搞定
    算法的复杂度包括时间复杂度和空间复杂度分别如何计算?
  • 原文地址:https://www.cnblogs.com/liushijie/p/4790432.html
Copyright © 2011-2022 走看看