〇、小故事
小王大学毕业,经过大学期间的刻苦学习,终于成功的面试上了一家公司。按照约定的时间,小王兴高采烈的来到公司前台去办理入职手续。
“您好,我是来办理入职手续的
”小王对前台妹妹说,前台妹妹看都没看他一眼,顺手递给了他一个单子,带着一丝不耐烦的语气跟他说,“照着单子做就行
”。小王接过单子一看,瞬间傻眼了,零零总总的列出了30多个条目,比如:
【办理档案】如果档案需要你自己去上家公司办理
【办理公积金】公积金自己去办公积金转移
【领取电脑】公司的电脑需要自己去电脑店采购
【办公软件安装】安装公司要求的软件列表进行安装
【确定工位】工位需要自己去申请分配
【办理工资卡】工资卡需要自己去银行办理,然后再去财务绑定一下
【办理工卡】工卡需要自己去制卡处办理领取
……
这都要靠自己去跑腿办理啊……那得办到啥时候啊。难道办理入职都这么费劲吗?他给他哥哥打了电话,他哥哥说,别入职了,我给你查了一下,这个公司是骗子公司,赶快回来。小王于是离开了那家公司。经过他哥哥的介绍,成功面试了某大型互联网公司,同样办理入职手续,小王被人力小姐姐带到了会议室,在合同上签了一些字,然后人力小姐姐把电脑,工卡都交给了小王,并带着他去了已经安排好的工位上,小王基本没有做什么,入职流程就结束了。小王非常开心。
通过上面的故事,我们发现,小王在这家大型互联网公司入职的时候,只是跟人力小姐姐说他要入职,那么后面的30多件入职需要待办的事情,人力小姐姐都帮他办完了,对于小王来说,入职如此简单高效。那么,这个人力小姐姐,也就是我们马上要介绍的设计模式——门面模式。
一、模式定义
门面模式/外观模式(Facade Pattern
)
提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
二、模式类图
为了进一步描述门面模式,我们可以模拟开车的场景,即:我们坐上一辆汽车的驾驶座,扭转汽车钥匙之后,汽车就发动起来了,但是这个过程其实包含了很多步骤,此处只列出3个步骤:车门上锁
、中控显示
、引擎工作
。那么,我们通过在Car类中提供一个run()
方法来封装汽车启动所需要的一系列操作。那么,对于驾驶员Client,只需要调用Car的run()
方法,就可以启动汽车了。具体类图如下所示:
三、代码实现
创建汽车和启动汽车方法:Car.java
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
public class Engine { public void start() { System.out.println("Engine start"); } }
创建车门类:Door.java
public class Door { public void lock() { System.out.println("Door lock"); } }
创建中控显示器类:DashboardDisplay.java
public class DashboardDisplay { void refreshDisplay() { System.out.println("DashboardDisplay refreshDisplay"); } }
创建钥匙类:Key.java
public class Key { public boolean turns() { System.out.println("Key turns"); return true; } }
测试类模拟司机开汽车:ClientTest.java
public class ClientTest { public static void main(String[] args) { Car car = new Car(); car.start(); // 启动汽车,用户并不知道引擎、车门、钥匙、中控的运作 } }
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」