趣解设计模式之《办理入职这么难吗?》

〇、小故事

小王大学毕业,经过大学期间的刻苦学习,终于成功的面试上了一家公司。按照约定的时间,小王兴高采烈的来到公司前台去办理入职手续。

"您好,我是来办理入职手续的"小王对前台妹妹说,前台妹妹看都没看他一眼,顺手递给了他一个单子,带着一丝不耐烦的语气跟他说,"照着单子做就行"。小王接过单子一看,瞬间傻眼了,零零总总的列出了30多个条目,比如:

办理档案 】如果档案需要你自己去上家公司办理

办理公积金 】公积金自己去办公积金转移

领取电脑 】公司的电脑需要自己去电脑店采购

办公软件安装 】安装公司要求的软件列表进行安装

确定工位 】工位需要自己去申请分配

办理工资卡 】工资卡需要自己去银行办理,然后再去财务绑定一下

办理工卡 】工卡需要自己去制卡处办理领取

......

这都要靠自己去跑腿办理啊......那得办到啥时候啊。难道办理入职都这么费劲吗? 他给他哥哥打了电话,他哥哥说,别入职了,我给你查了一下,这个公司是骗子公司,赶快回来。小王于是离开了那家公司。经过他哥哥的介绍,成功面试了某大型互联网公司,同样办理入职手续,小王被人力小姐姐带到了会议室,在合同上签了一些字,然后人力小姐姐把电脑,工卡都交给了小王,并带着他去了已经安排好的工位上,小王基本没有做什么,入职流程就结束了。小王非常开心。

null

通过上面的故事,我们发现,小王在这家大型互联网公司入职的时候,只是跟人力小姐姐说他要入职,那么后面的30多件入职需要待办的事情,人力小姐姐都帮他办完了,对于小王来说,入职如此简单高效。那么,这个人力小姐姐,也就是我们马上要介绍的设计模式------门面模式

一、模式定义

门面模式/外观模式Facade Pattern

提供了一个统一的接口 ,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

二、模式类图

为了进一步描述门面模式,我们可以模拟开车的场景,即:我们坐上一辆汽车的驾驶座,扭转汽车钥匙之后,汽车就发动起来了 ,但是这个过程其实包含了很多步骤,此处只列出3个步骤:车门上锁中控显示引擎工作。那么,我们通过在Car类中提供一个run()方法来封装汽车启动所需要的一系列操作。那么,对于驾驶员Client,只需要调用Car的run()方法,就可以启动汽车了。具体类图如下所示:

null

三、代码实现

创建汽车和启动汽车方法Car.java

scss 复制代码
public class Car {
    private Engine engine;
    private Door door;
    private DashboardDisplay display;
    private Key key;

    public Car() {
        engine = new Engine();
        door = new Door();
        display = new DashboardDisplay();
        key = new Key();
    }

    /** 汽车启动 */
    public void start() {
        if (key.turns()) {
            door.lock();
            engine.start();
            display.refreshDisplay();
        }
    }
}

创建发动机类Engine.java

csharp 复制代码
public class Engine {
    public void start() {
        System.out.println("Engine start");
    }
}

创建车门类Door.java

csharp 复制代码
public class Door {
    public void lock() {
        System.out.println("Door lock");
    }
}

创建中控显示器类DashboardDisplay.java

csharp 复制代码
public class DashboardDisplay {
    void refreshDisplay() {
        System.out.println("DashboardDisplay refreshDisplay");
    }
}

创建钥匙类Key.java

csharp 复制代码
public class Key {
    public boolean turns() {
        System.out.println("Key turns");
        return true;
    }
}

测试类模拟司机开汽车ClientTest.java

typescript 复制代码
public class ClientTest {
    public static void main(String[] args) {
        Car car = new Car();
        car.start(); // 启动汽车,用户并不知道引擎、车门、钥匙、中控的运作
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号"爪哇缪斯" ~ (^o^)/ ~ 「干货分享,每天更新」

相关推荐
JustHappy1 小时前
古法编程秘籍(七):互联网到底是什么?把两台电脑怎么说话搞懂就够了
前端·后端·网络协议
Hommy881 小时前
【剪映小助手】添加图片接口(Add Images)
后端·github·剪映小助手·视频剪辑自动化
GetcharZp2 小时前
别再盲目用 OpenCV 读图了,这才是 CV 预处理的终极杀手锏!
后端
kyriewen2 小时前
Git Commit 前自动修复代码风格?配置 Husky + lint-staged,从此 CR 只聊逻辑
前端·git·面试
程序员二叉2 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉2 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
IT_陈寒5 小时前
Vite热更新失效?可能你在用Windows
前端·人工智能·后端
IT龟苓膏6 小时前
并发深度解析】硬核手撕 ForkJoinPool + WorkStealing + CompletableFuture 底层源码与大厂面试演练
面试·职场和发展
椰椰椰耶6 小时前
[SpringCloud][14]OpenFeign参数传递方法
后端·spring·spring cloud
onething3657 小时前
Spring Boot + Spring AI 从入门到实战:7天转型计划 Day 3 —— 消息表设计 + 级联删除 + 事务管理
人工智能·后端