三分钟学会《门面模式》

前言

只有光头才能变强

回顾前面所写过的设计模式:

无论是面试还是个人的提升,设计模式是必学的。今天来讲解门面(外观)模式~

上一次分享了一篇好文:《为什么阿里巴巴禁止工程师直接使用日志系统(Log4j、Logback)中的 API

【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一

不知道大家有没有了解过门面模式,我去翻了一下《设计模式之禅》,发现非常简单,所以在这给大家分享一下。

一、门面(外观)模式介绍

1.1门面模式现实例子

一个电源总开关可以控制所有电器的打开或关闭状态。

image

无论是空调、冰箱、电视、电脑、风扇等等,只要是电器都受这个电闸控制。只要这个电闸将关闭,所有的电器都会受到牵连(一同关闭)。

电源总开关(电闸)即为该系统的外观模式设计。

1.2回到代码世界

比如,我们家里现在有空调、冰箱、电脑这么几个电器


// 冰箱
public class Fridge {

 // 关闭冰箱
 public void turnOff() {

 }

 // 开冰箱灯..减低冰箱温度..调高冰箱温度...
}


// 电视
public class Television {


 // 关闭电视
 public void turnOffTV() {
 System.out.println("关闭电视");
 }

 // 切换电视节目..减低电视声音..调高电视声音...
 public void doSomething() {
 System.out.println("切换电视节目..减低电视声音..调高电视声音...");
 }
}

// 电脑
public class Computer {
 // 关闭电脑
 public void turnOffComputer() {
 System.out.println("关闭电脑");
 }

 // 使用电脑干别的事~
 public void doSomething() {
 System.out.println("使用电脑干别的事~");
 }

} 

如果没有电闸的的情况下,我想将上面的电器关闭掉,我需要这样干:


 // 我要关闭电视、电脑、空调
 public static void main(String[] args) {
 new Computer().turnOffComputer();
 new Fridge().turnOffFridge();
 new Television().turnOffTV();

 // 当然了,一个正常的家庭不单单只有这么点电器的。
 // 如果某一天我想关闭家里所有的电器,就需要重复new 个对象,调用其turn offer方法
 } 

一个一个关是不是很麻烦,所以我们就有了电闸:


// 电闸
public class ElectricBrake {
 private Computer computer = new Computer();
 private Fridge fridge = new Fridge();
 private Television television = new Television();

 // 关闭所有电器
 public void turnOffAll() {
        computer.turnOffComputer();
        fridge.turnOffFridge();
        television.turnOffTV();
 }
} 

当我们想关闭所有电器的时候,我们可以使用电闸来关闭。


// 我要关闭所有电器
 public static void main(String[] args) {
 ElectricBrake brake = new ElectricBrake();
        brake.turnOffAll();
 } 

有经验的同学可能就会想,这不就再封装了一层吗??这就是门面模式啦??嗯,没错,这就是门面模式

1.3门面模式介绍

《设计模式之禅》:

要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。

门面模式的通用类图十分简单:

image

按照我们的例子,子系统就相当于电脑、冰箱、电视。统一的对象就相当于我们的电闸。我们通过电闸来对所有电器进行关闭(使得不用逐个逐个找电脑、冰箱、电视来关闭)

image

使用了门面模式,使客户端调用变得更加简单

image

1.4门面模式的优缺点

优点:

  1. 减少系统的相互依赖。使用门面模式,所有的依赖都是对门面对象的依赖,与子系统无关

  2. 提高了灵活性。不管子系统内部如何变化,只要不影响门面对象,任你自由活动。

缺点:

  1. 不符合开闭原则,对修改关闭,对扩展开放。比如我们上面的例子,如果有新电器要想要加入一次关闭的队伍中,只能在门面对象上修改 turnOffAll()方法的代码。

最后

是不是觉得门面设计模式就那么一回事了?说白了就是对子系统封装了一层,给予了一个高层次的接口(门面对象),进而方便客户端调用。

推荐阅读和参考资料:

乐于分享和输出干货的Java技术公众号:Java3y。关注即可领取海量的视频资源!

帅的人都关注了

文本已收录至我的GitHub仓库,欢迎Star:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,785评论 2 89
  • 本文旨在快速梳理常用的设计模式,了解每个模式主要针对的是哪些情况以及其基础特征,每个模式前都有列举出一个或多个可以...
    蛮三刀酱阅读 1,727评论 0 1
  • 链接:https://github.com/WiKi123/DesignPattern作者: WiKi123(gi...
    树懒啊树懒阅读 3,282评论 0 2
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,861评论 0 9
  • 周末的晚饭后,几个朋友相约到山哥新开的“一品兰香白茶居”去喝茶。一进茶居已有不少茶友,互相招呼、问...
    梦鸿成阅读 1,199评论 0 8