只有光头才能变强html
回顾前面所写过的设计模式:git
给女友讲解什么是代理模式github
单例模式你会几种写法?设计模式
工厂模式理解了没有?app
不管是面试仍是我的的提高,设计模式是必学的。今天来说解门面(外观)模式~ide
上一次分享了一篇好文:《为何阿里巴巴禁止工程师直接使用日志系统(Log4j、Logback)中的 API》ui
【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。spa
不知道你们有没有了解过门面模式,我去翻了一下《设计模式之禅》,发现很是简单,因此在这给你们分享一下。
1、门面(外观)模式介绍一个电源总开关能够控制全部电器的打开或关闭状态。
不管是空调、冰箱、电视、电脑、风扇等等,只要是电器都受这个电闸控制。只要这个电闸将关闭,全部的电器都会受到牵连(一同关闭)。
电源总开关(电闸)即为该系统的外观模式设计。
好比,咱们家里如今有空调、冰箱、电脑这么几个电器
// 冰箱
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(); }
有经验的同窗可能就会想,这不就再封装了一层吗??这就是门面模式啦??嗯,没错,这就是门面模式
《设计模式之禅》:
要求一个子系统的外部与其内部的通讯必须经过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
门面模式的通用类图十分简单:
按照咱们的例子,子系统就至关于电脑、冰箱、电视。统一的对象就至关于咱们的电闸。咱们经过电闸来对全部电器进行关闭(使得不用逐个逐个找电脑、冰箱、电视来关闭)
使用了门面模式,使客户端调用变得更加简单!
优势:
减小系统的相互依赖。使用门面模式,全部的依赖都是对门面对象的依赖,与子系统无关
提升了灵活性。无论子系统内部如何变化,只要不影响门面对象,任你自由活动。
缺点:
不符合开闭原则,对修改关闭,对扩展开放。好比咱们上面的例子,若是有新电器要想要加入一次关闭的队伍中,只能在门面对象上修改 turnOffAll()
方法的代码。
是否是以为门面设计模式就那么一回事了?说白了就是对子系统封装了一层,给予了一个高层次的接口(门面对象),进而方便客户端调用。
推荐阅读和参考资料:
《设计模式之禅》
https://blog.csdn.net/hguisu/article/details/7533759
https://www.cnblogs.com/lthIU/p/5860607.html
乐于分享和输出干货的Java技术公众号:Java3y。
文章的目录导航:
https://github.com/ZhongFuCheng3y/3y