三分钟学会《门面模式》
前言
只有光头才能变强
回顾前面所写过的设计模式:
无论是面试还是个人的提升,设计模式是必学的。今天来讲解门面(外观)模式~
上一次分享了一篇好文:《为什么阿里巴巴禁止工程师直接使用日志系统(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门面模式的优缺点
优点:
-
减少系统的相互依赖。使用门面模式,所有的依赖都是对门面对象的依赖,与子系统无关
-
提高了灵活性。不管子系统内部如何变化,只要不影响门面对象,任你自由活动。
缺点:
- 不符合开闭原则,对修改关闭,对扩展开放。比如我们上面的例子,如果有新电器要想要加入一次关闭的队伍中,只能在门面对象上修改
turnOffAll()
方法的代码。
最后
是不是觉得门面设计模式就那么一回事了?说白了就是对子系统封装了一层,给予了一个高层次的接口(门面对象),进而方便客户端调用。
推荐阅读和参考资料:
-
《设计模式之禅》
乐于分享和输出干货的Java技术公众号:Java3y。关注即可领取海量的视频资源!
文本已收录至我的GitHub仓库,欢迎Star:
相关文章
- 以“五力”,破解中小企业数字化转型的“无能为力”
- 定制化算子融合,大幅提升AI端到端性能
- 仅需10%参数量即超越SOTA!浙大、字节、港中文联合提出「类别级位姿估计」任务新框架
- Kubecon 2022大会概览:Kubernetes走向“工业化”
- 八个提升程序员工作效率的小工具
- 现今有价值的 15 项 IT 认证证书,你有哪一种?
- Meta AI开放6亿+宏基因组蛋白质结构图谱,150亿语言模型用两周完成
- 马斯克收购 Twitter:把你们的代码都打印出来
- 假如我是核酸系统架构师,我会...
- 谷歌提出Data-free NAS,网络搜索仅需一个预训练模型
- 特斯拉前AI总监Karpathy解密离职和纯视觉方案
- Gartner对2000多名首席信息官的调查表明 通过数字投资缩短价值实现时间的必要性
- 用AI发帖意外爆火,点赞量是平常几十倍还涨了波粉,剑桥学霸自曝幕后制作过程
- 《羊了个羊》实控人拿走3亿后回应、华为起诉亚马逊、Chrome浏览器将停止支持Win7/8.1 | T资讯
- 超懂中国传统文化的AI绘画模型,画作有形更有神,传达儒释道思想
- AI求解偏微分方程新基准登NeurIPS,发现JAX计算速度比PyTorch快6倍,LeCun转发:这领域确实很火
- Linux之父:将彻底放弃这款处理器
- 哪些行业需要东数西算?
- 新加坡和德国将互认物联网网络安全标签
- 四分钟对打300多次,谷歌教会机器人打乒乓球