三分钟学会《门面模式》

简介:

前言

只有光头才能变强

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

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

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

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

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

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

1.1门面模式现实例子

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

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

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

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门面模式介绍

《设计模式之禅》:

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

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

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

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

1.4门面模式的优缺点

优点:

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

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

缺点:

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

最后

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

推荐阅读和参考资料:

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
11天前
|
设计模式 消息中间件 存储
18个并发场景的设计模式详解,有没有你的盲区
这些模式在多线程并发编程中非常有用`。在分布式应用中,并发场景无处不在,理解和掌握这些并发模式的编码技巧,有助于我们在开发中解决很多问题,这要把这些与23种设计模式混淆了,虽然像单例模式是同一个,但这个是考虑并发场景下的应用。内容比较多,V哥建议可以收藏起来,即用好查。拜拜了您誒,晚安。
18个并发场景的设计模式详解,有没有你的盲区
|
2月前
|
设计模式 存储 机器学习/深度学习
掌握C++中介者模式:设计与应用全攻略
掌握C++中介者模式:设计与应用全攻略
45 0
|
5月前
|
设计模式 API 数据格式
二十三种设计模式全面解析-适配器模式:代码的奇迹之桥,连接你的世界!
二十三种设计模式全面解析-适配器模式:代码的奇迹之桥,连接你的世界!
|
8月前
|
设计模式
趣解设计模式之《同学们,交作业啦!》
趣解设计模式之《同学们,交作业啦!》
56 1
|
9月前
|
设计模式 C++
2023-7-11-第十六式职责链模式
2023-7-11-第十六式职责链模式
49 0
|
9月前
|
设计模式 缓存 安全
2023-6-29-第十一式代理模式
2023-6-29-第十一式代理模式
49 0
【机房重构】— 登陆折射出外观模式
上图中明显可以看出UI中创建了一个登陆(FrmLogin)界面,在外观层中创建了对应的登陆外观(LoginFacade)类,因为登陆涉及两个表的逻辑判断,所以BLL层创建了用户信息(UserBLL)和用户工作记录(WorkLogBLL)类。
|
11月前
|
设计模式
大话设计模式——单例模式(前奏)
大话设计模式——单例模式(前奏)
66 0
Zp
初尝策略模式~真香
初尝策略模式~真香
Zp
116 0
|
设计模式 前端开发 Java
二十三天学会设计模式之中介模式
二十三天学会设计模式之中介模式
二十三天学会设计模式之中介模式