文章目录

  • 概述
  • 外观模式的特点
  • 外观模式的应用场景
  • 外观模式的结构与实现
      • 模式的结构
    • 模式的实现
  • 总结

概述

外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,看下类图:(我们以一个计算机的启动过程为例)

外观模式的特点

  • 外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点:

    • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
    • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
    • 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。
  • 外观(Facade)模式的主要缺点如下:
    • 不能很好地限制客户使用子系统类,很容易带来未知风险。
    • 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

外观模式的应用场景

通常在以下情况下可以考虑使用外观模式。

  1. 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  2. 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  3. 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

外观模式的结构与实现

外观(Facade)模式的结构比较简单,主要是定义了一个高层接口。

它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。现在来分析其基本结构和实现方法。

模式的结构

外观(Facade)模式包含以下主要角色。

  1. 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
  2. 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
  3. 客户(Client)角色:通过一个外观角色访问各个子系统的功能。

模式的实现

public class CPU {public void startup(){System.out.println("cpu startup!");}public void shutdown(){System.out.println("cpu shutdown!");}
}public class Memory {public void startup(){System.out.println("memory startup!");}public void shutdown(){System.out.println("memory shutdown!");}
}public class Disk {public void startup(){System.out.println("disk startup!");}public void shutdown(){System.out.println("disk shutdown!");}
}public class Computer {private CPU cpu;private Memory memory;private Disk disk;public Computer(){cpu = new CPU();memory = new Memory();disk = new Disk();}public void startup(){System.out.println("start the computer!");cpu.startup();memory.startup();disk.startup();System.out.println("start computer finished!");}public void shutdown(){System.out.println("begin to close the computer!");cpu.shutdown();memory.shutdown();disk.shutdown();System.out.println("computer closed!");}
}//测试
public class User {public static void main(String[] args) {Computer computer = new Computer();computer.startup();computer.shutdown();}
}

输出结果如下:

start the computer!
cpu startup!
memory startup!
disk startup!
start computer finished!
begin to close the computer!
cpu shutdown!
memory shutdown!
disk shutdown!
computer closed!

如果我们没有Computer类,那么,CPU、Memory、Disk他们之间将会相互持有实例,产生关系,这样会造成严重的依赖,修改一个类,可能会带来其他类的修改,这不是我们想要看到的,有了Computer类,他们之间的关系被放在了Computer类里,这样就起到了解耦的作用,这,就是外观模式!

总结

优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。

缺点: 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。

注意事项: 在层次化结构中,可以使用外观模式定义系统中每一层的入口。

更多请移驾。。。

23种设计模式之外观模式相关推荐

  1. 23种设计模式之外观模式(Facade)

    外观模式是对象的结构模式,要求外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 优点: 1 ...

  2. (你也可以像别人一样对框架底层源码来去自如)23种设计模式之外观模式

    外观模式 基本介绍 外观模式,也叫过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式通过定义一个一致的接口,用以屏蔽内部 ...

  3. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  4. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  5. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  6. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  7. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  8. 23种设计模式之代理模式

    文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...

  9. 23种设计模式----中介者模式----行为型模式

    中介者模式 1.什么是中介者模式 2.中介者模式的角色 3.例子 3.1 项目结构 3.2 共同实体 3.3 抽象的中介者 3.4 抽象的被中介者 3.5 具体的中介者 3.6 具体的被中介者 3.7 ...

最新文章

  1. Silverlight与WPF中BeginInvoke的差异
  2. Activity和ListActivity的区别
  3. 【DND图形库】一、简介与环境配置
  4. webusercontrol ajax,ASP.NET页面使用AjaxPro2完成JS调用后台方法
  5. 想在“双十一”做“爆款”?你的数据库存能支撑吗?
  6. C语言遇空字符缩进,c语言代码缩进和空白
  7. 转载sanmusoft 论电脑报论坛的挂掉及电脑报的最后倒掉
  8. 掌握好这几点方法学习Linux,一定比别人更快入门运维!
  9. 阶段3 3.SpringMVC·_05.文件上传_1 文件上传之上传原理分析和搭建环境
  10. 计算机应用基础实操题怎么操,计算机基础实操试题
  11. 计算机信息安全认识实习报告
  12. 靠谱,这个低代码平台贼好用
  13. 学python看小甲鱼还是黑马_为什么我看完小甲鱼的python视频还是不会写呢?
  14. 转载:.Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法
  15. thingworx ADO安装
  16. videoleap自带素材_videoleap教程:制作电影帷幕开场效果细解
  17. 综述(三)无人驾驶中感知系统的工作流程及原理
  18. WinDbg命令详解--执行
  19. Windows10 任务栏网络图标消失不见的解决办法
  20. 华为起诉三星启示几何 探讨知识产权在中国

热门文章

  1. 诗雨带你彻底征服AndroidStudio的安装与配置问题!
  2. RJ45带网络变压器
  3. dw如何点击图片放大的代码_Dreamweaver 如何做到图形放大缩小的交互效果
  4. 纯键盘操作电脑,无鼠标操作
  5. 反NP监视原理并有实例说明
  6. 每天一道面试题(JAVA)
  7. 南邮微型计算机,南邮 微机原理(微型计算机与接口技术)复习ASM含部分答案.ppt...
  8. bzoj3744 Gty的妹子序列
  9. 软件模块之间耦合度的强弱排序
  10. Json的数据结构详解