目录

说明

目标

实现方式

注意事项

其他链接


说明

  • 结构型模式之一,其他还有适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式
  • 外观模式(Facade Pattern)通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节

目标

  • 调用方只接触外观类,即可使用子模块/子系统的功能接口
  • 外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用

实现方式

现在提倡智能家居,很多电子产品发挥了重要作用,例如电视机、空调、智能灯光等等。小明觉得很懒,想着开关电视机就得拿电视机的遥控器,开关空调也得用空调遥控器,开关灯也是如此。有没有一款万能遥控器,可以遥控各个家电,甚至可以一键开关多个家电的呢?当然,这就可以用外观模式(门面模式/过程模式)来实现了。

/*** 外观模式(门面模式)(调用方只接触外观类,即可使用子模块/子系统的功能接口)* <p>* 以万能遥控器遥控各个电器为例** @author ZRH* @version 1.0.0* @date 2020/7/23*/
public class FacadeTest {public static void main(String[] args) {AbstractMachine airConditioner = new AirConditioner();AbstractMachine television = new Television();AbstractMachine light = new Light();UniversalRemote universalRemote = new UniversalRemote(airConditioner, television, light);// 打开universalRemote.turnOnAirConditioner();universalRemote.turnOnTelevisionAndLight();// 关闭universalRemote.turnOffAirConditioner();universalRemote.turnOffTelevisionAndLight();}
}abstract class AbstractMachine {/*** 开启* <p>* @author : ZRH* @version : 1.0.0* @date : 2020-07-23*/public abstract void turnOn();/*** 关闭* <p>* @author : ZRH* @version : 1.0.0* @date : 2020-07-23*/public abstract void turnOff();
}/*** 空调* <p>** @author ZRH* @version 1.0.0* @date 2020/7/23*/
class AirConditioner extends AbstractMachine {/*** 开启* <p>** @author : ZRH* @version : 1.0.0* @date : 2020-07-23*/@Overridepublic void turnOn() {System.out.println("开空调");}/*** 关闭* <p>** @author : ZRH* @version : 1.0.0* @date : 2020-07-23*/@Overridepublic void turnOff() {System.out.println("关空调");}
}/*** 电视* <p>** @author ZRH* @version 1.0.0* @date 2020/7/23*/
class Television extends AbstractMachine {/*** 开启* <p>** @author : ZRH* @version : 1.0.0* @date : 2020-07-23*/@Overridepublic void turnOn() {System.out.println("开电视");}/*** 关闭* <p>** @author : ZRH* @version : 1.0.0* @date : 2020-07-23*/@Overridepublic void turnOff() {System.out.println("关电视");}
}/*** 灯* <p>** @author ZRH* @version 1.0.0* @date 2020/7/23*/
class Light extends AbstractMachine {/*** 开启* <p>** @author : ZRH* @version : 1.0.0* @date : 2020-07-23*/@Overridepublic void turnOn() {System.out.println("开灯");}/*** 关闭* <p>** @author : ZRH* @version : 1.0.0* @date : 2020-07-23*/@Overridepublic void turnOff() {System.out.println("关灯");}
}/*** 万能遥控器(Facade类), 可自定义暴露的接口* <p>** @author ZRH* @version 1.0.0* @date 2020/7/23*/
class UniversalRemote {private final AbstractMachine airConditioner;private final AbstractMachine television;private final AbstractMachine light;public UniversalRemote(AbstractMachine airConditioner, AbstractMachine television, AbstractMachine light) {this.airConditioner = airConditioner;this.television = television;this.light = light;}/*** 遥控器一键打开电视和灯(自定义暴露的接口)* <p>** @author ZRH* @date 2020-07-23* @version 1.0.0*/public void turnOnTelevisionAndLight() {if (television == null || light == null) {System.out.println("机器未知类型");} else {television.turnOn();light.turnOn();}}/*** 遥控器一键关闭电视和灯* <p>** @author ZRH* @date 2020-07-23* @version 1.0.0*/public void turnOffTelevisionAndLight() {if (television == null || light == null) {System.out.println("机器未知类型");} else {television.turnOff();light.turnOff();}}/*** 遥控器打开空调* <p>** @author ZRH* @date 2020-07-23* @version 1.0.0*/public void turnOnAirConditioner() {if (airConditioner == null) {System.out.println("机器未知类型");} else {airConditioner.turnOn();}}/*** 遥控器关闭空调* <p>** @author ZRH* @date 2020-07-23* @version 1.0.0*/public void turnOffAirConditioner() {if (airConditioner == null) {System.out.println("机器未知类型");} else {airConditioner.turnOff();}}}

在万能遥控器类里,我们可以自行封装所需方法,要哪几种电器捆绑一起就捆绑一起。


注意事项

  • 外观模式对外屏蔽了子系统的细节,降低了客户端对子系统使用的复杂性
  • 当系统需要进行分层设计时,可以考虑使用Facade模式
  • 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade类,来提供遗留系统的比较清晰简单的接口,让新系统与Facade类交互,提高复用性
  • 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。要以让系统有层次,利于维护为目的

其他链接

【Java设计模式】简单学工厂模式

【Java设计模式】简单学抽象工厂模式

【Java设计模式】简单学建造者模式

【Java设计模式】简单学单例模式

【Java设计模式】简单学原型模式

【Java设计模式】其他模式~

【Java设计模式】简单学外观模式——万能遥控器相关推荐

  1. java设计模式之九外观模式(Facade)

    外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 ...

  2. 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!

  3. JAVA设计模式之【外观模式】

    通过引入一个外观角色来简化客户端与子系统之间的交互. 顾客无需直接和茶叶.茶具.开水等交互,整个泡茶过程由服务员来完成,顾客只需与服务员交互即可. 通过引入一个外观角色可以降低原有系统的复杂度,同时降 ...

  4. 【Java设计模式】简单学桥接模式——来杯大杯加奶不加糖咖啡

    目录 说明 目标 实现方式 应用场景 其他链接 说明 结构型模式之一,其他还有适配器模式.装饰模式.组合模式.外观模式.享元模式.代理模式 目标 用抽象关联取代了多层继承,将类之间的静态继承关系转换为 ...

  5. 【Java设计模式】简单学访问者模式——我的选择是,Yes

    目录 说明 实现方式 优点 缺点 应用场景 其他链接 说明 行为型模式之一,其他还有命令模式.模板方法模式.迭代器模式.观察者模式.中介者模式.备忘录模式.解释器模式(Interpreter模式).状 ...

  6. 【Java设计模式】简单学解释器模式——加减乘除

    目录 说明 实现方式 应用场景 其他链接 说明 行为型模式之一,其他还有命令模式.模板方法模式.访问者模式.观察者模式.中介者模式.备忘录模式.迭代器模式.状态模式.策略模式.职责链模式(责任链模式) ...

  7. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  8. Java设计模式之责任链模式(简单易懂)

    前言: 责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿 ...

  9. 【白话设计模式二】外观模式(Facade)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

最新文章

  1. matlab外部接口简介
  2. (c语言)和与积的运算第三篇
  3. 每个程序员都必读的12篇文章
  4. Linux驱动(1)--关于驱动的概述
  5. 现代图论笔记(二)树与二分图
  6. 华为Mate30 Pro高清渲染图曝光:后置四摄+挖孔全面屏
  7. 腾讯云启动 tomcat 很慢的问题
  8. [转]@html.ActionLink的几种参数格式
  9. Java基础continue语句
  10. 机器学习NLP领域入门
  11. Windows Azure AppFabric应用程序
  12. Springboot 使用 Guava 的重试Retry ,轻便灵活
  13. office excel 条件格式——使用公式确定要设置格式的单元格——筛选并标记一个表中每行数据的最小(大)值
  14. 祝福大家劳动节节日快乐
  15. 内卷、躺平与中年危机的相关思考
  16. Nginx 联合创始人已被释放:“这是典型的敲诈,就这么简单”
  17. baidu进阶训练笔记九20200727
  18. 软件定义广域网和即将到来的网络洪流
  19. Hadoop高手之路4-HDFS
  20. make menuconfig中各设置项目查找

热门文章

  1. 手把手带你安装PyTorch指定版本嘿!
  2. jira是干什么_JIRA是什么?
  3. vue-chartjs
  4. 关于CAN和CANFD物理层和数据链路层的对比分析
  5. python写情书_Python程序员用文字加密的方式,给女程序员写情书,一周后牵手回家_TONOW...
  6. (FJWC2020)DTOJ 4688. 迫害 DJ
  7. 【观察】用友BIP:以商业创新筑牢新底座,驱动产业链整合与跃迁
  8. ROS - MoveIt 学习
  9. 华为云计算IE面试笔记-华为云迁移工具Rainbow功能简介。支持哪些虚拟化平台和操作系统的迁移?支持哪些业务迁移方式?Windows在线迁移和Linux在线迁移前针对OS需要做哪些检查?
  10. 【Linux】:shell循环语句