转自:https://www.cnblogs.com/lthIU/p/5860607.html

针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下。

一、概念介绍

  外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。

二、角色及使用场景

  简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。

  1).门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。

  2).子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。

  3).客户角色:通过调用Facede来完成要实现的功能。

  使用场景:

  1- 为复杂的模块或子系统提供外界访问的模块;

  2- 子系统相互独立;

  3- 在层析结构中,可以使用外观模式定义系统的每一层的入口。

三、实例

  下面,我们就通过一个简单的例子来实现该模式。

  每个Computer都有CPU、Memory、Disk。在Computer开启和关闭的时候,相应的部件也会开启和关闭,所以,使用了该外观模式后,会使用户和部件之间解耦。如:

包体的创建:

代码实现

首先是子系统类:

【代码清单--1】

 1 package com.huawei.facadeDesign.children;
 2
 3 import org.apache.log4j.Logger;
 4
 5 /**
 6  * cpu子系统类
 7  * @author Administrator
 8  *
 9  */
10 public class CPU
11 {
12     public static final Logger LOGGER = Logger.getLogger(CPU.class);
13     public void start()
14     {
15         LOGGER.info("cpu is start...");
16     }
17
18     public void shutDown()
19     {
20         LOGGER.info("CPU is shutDown...");
21     }
22 }

View Code

【代码清单--2】

 1 package com.huawei.facadeDesign.children;
 2
 3 import org.apache.log4j.Logger;
 4
 5 /**
 6  * Disk子系统类
 7  * @author Administrator
 8  *
 9  */
10 public class Disk
11 {
12     public static final Logger LOGGER = Logger.getLogger(Disk.class);
13     public void start()
14     {
15         LOGGER.info("Disk is start...");
16     }
17
18     public void shutDown()
19     {
20         LOGGER.info("Disk is shutDown...");
21     }
22 }

View Code

【代码清单--3】

 1 package com.huawei.facadeDesign.children;
 2
 3 import org.apache.log4j.Logger;
 4
 5 /**
 6  * Memory子系统类
 7  * @author Administrator
 8  *
 9  */
10 public class Memory
11 {
12     public static final Logger LOGGER = Logger.getLogger(Memory.class);
13     public void start()
14     {
15         LOGGER.info("Memory is start...");
16     }
17
18     public void shutDown()
19     {
20         LOGGER.info("Memory is shutDown...");
21     }
22 }

View Code

然后是,门面类Facade

【代码清单--4】

 1 package com.huawei.facadeDesign.facade;
 2
 3 import org.apache.log4j.Logger;
 4
 5 import com.huawei.facadeDesign.children.CPU;
 6 import com.huawei.facadeDesign.children.Disk;
 7 import com.huawei.facadeDesign.children.Memory;
 8
 9
10 /**
11  * 门面类(核心)
12  * @author Administrator
13  *
14  */
15 public class Computer
16 {
17     public static final Logger LOGGER = Logger.getLogger(Computer.class);
18
19     private CPU cpu;
20     private Memory memory;
21     private Disk disk;
22     public Computer()
23     {
24         cpu = new CPU();
25         memory = new Memory();
26         disk = new Disk();
27     }
28     public void start()
29     {
30         LOGGER.info("Computer start begin");
31         cpu.start();
32         disk.start();
33         memory.start();
34         LOGGER.info("Computer start end");
35     }
36
37     public void shutDown()
38     {
39         LOGGER.info("Computer shutDown begin");
40         cpu.shutDown();
41         disk.shutDown();
42         memory.shutDown();
43         LOGGER.info("Computer shutDown end...");
44     }
45 }

View Code

最后为,客户角色。

【代码清单--5】

 1 package com.huawei.facadeDesign;
 2
 3 import org.apache.log4j.Logger;
 4
 5 import com.huawei.facadeDesign.facade.Computer;
 6
 7 /**
 8  * 客户端类
 9  * @author Administrator
10  *
11  */
12 public class Cilent {
13     public static final Logger LOGGER = Logger.getLogger(Cilent.class);
14     public static void main(String[] args)
15     {
16         Computer computer = new Computer();
17         computer.start();
18         LOGGER.info("=================");
19         computer.shutDown();
20     }
21
22 }

View Code

【代码清单--6】运行结果

从上面的实例来看,有了这个Facade类,也就是Computer类,用户就不用亲自去调用子系统中的Disk,Memory、CPU类了,不需要知道系统内部的实现细节,甚至都不用知道系统内部的构成。客户端只需要跟Facade交互就可以了。

四、优点

  - 松散耦合

  使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;

  - 简单易用

  客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。

  - 更好的划分访问层次

  有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。

五、延伸及应用(补充)

  ...

希望对大家的学习有帮助,请多指教。

转载于:https://www.cnblogs.com/Hermioner/p/10244901.html

设计模式09----门面设计模式相关推荐

  1. 设计模式之门面设计模式

    一.理清门面 门面模式很简单而且我们就在使用,废话不多说直接上类图. 关注Client类和Facad类还有subsystem即可. OK,是不是觉得似曾相识,哈哈一会解答.先捋一捋门面的作用,从类图上 ...

  2. 常用的设计模式(七)——门面设计模式

    随着系统的不断改进和开发,它们会变得越来越复杂,系统会生成大量的类,这使得程序流程更难被理解.门面模式可为这些类提供一个简化的接口,从而简化访问这些类的复杂性. 门面模式(Facade)也被称为正面模 ...

  3. 抽丝剥茧——调停者和门面设计模式

    调停者和门面设计模式 今天我们来聊两个设计模式:调停者设计模式和门面设计模式,为什么要将他们放在一起讲解,因为他们两个东东太像了,仅仅是由于作用的地方不同而产生的不同的叫法. 我们用一个对于我们90后 ...

  4. 20191219 门面设计模式

    门面设计模式 外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式. 使用哪种设计模式属于详细设计. 门面模式就是动里不动外,让外层好调用.使用门面设计模式. 门面设计 ...

  5. 简易的动物园管理系统之Java8流式API的重构代码(使用 门面设计模式)

    文章目录 前言 之前的文章 本次的源码 AnimalTypeEnum SexEnum Animal AnimalFactory BaseAnimal Bird Cat Dog Fish AddAnim ...

  6. 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式

    [网络配图] 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.设计 ...

  7. Java中的门面设计模式,非常有用!

    门面设计模式又叫外观设计模式,其核心思想正如其字面意思,向用户提供一个门户,用户只需要访问这个门户来获取他们想要的数据,无需管理这个门户内部的构成,也无需知道里面的运行流程等等,对于开发者来说,使用门 ...

  8. .net 有哪些主流的设计模式_「设计模式自习室」门面模式 Facade Pattern

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  9. 门面设计模式(Facade Pattern)

    GOF设计模式 Facade Pattern 门面设计模式 门面模式例子:我有一个专业的Nikon相机,我就喜欢自己手动调光圈.快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会.幸好相机 ...

  10. python设计模式名片_Python设计模式之门面模式简单示例

    本文实例讲述了python设计模式之门面模式.分享给大家供大家参考,具体如下: facade:建筑物的表面 门面模式是一个软件工程设计模式,主要用于面向对象编程. 一个门面可以看作是为大段代码提供简单 ...

最新文章

  1. 深度全解卷积神经网络(附论文)
  2. 发推吐槽职场性别歧视后,苹果女高管被无限期行政休假
  3. python modbus类封装_Python 中引入一个文件,模块的概念
  4. 《系统集成项目管理工程师》必背100个知识点-59项目总结会议
  5. POJ 1449 amp; ZOJ 1036 Enigma(简单枚举)
  6. 【Vue】 element ui 引入第三方图标
  7. java多线程意义_Java多线程学习之多线程的概念及意义
  8. Mybatis主要内容
  9. Ubuntu关于apt-get remove与apt-get purge
  10. PAT 1074. 宇宙无敌加法器(20)-PAT乙级真题
  11. 在eclispe的类中快速打出main方法
  12. springmvc并发调用controller方法时对局部变量的影响
  13. MIPS指令集确实够精简,编译文件明显小
  14. 文件系统中,Path和Directory的区别
  15. 关于Word目录英文自动大写无法更改问题的处理办法
  16. (三)描述统计学:数值方法
  17. 搭建网站显示成功后却打不开主页原因
  18. linu系统中dhcp的搭建
  19. 安卓 ANR 原因,解决方法
  20. IMX6 / IMX8 系列芯片简单对比

热门文章

  1. Linux 命令之 ln -- 为文件创建链接
  2. Linux 命令之 touch -- 创建文件
  3. 普通人学python好吗_有人问,普通人学python真的有意义吗?看看大家都是怎么说的吧...
  4. 二维动画作品_「咻动画」二维动画制作中角色造型的设计要点
  5. C语言中几个容易踩的“坑”!
  6. C语言中的“悬空指针”和“野指针”是什么意思?
  7. 计算机专业去荷兰还是瑞典,给申请计算机专业的同学几点建议
  8. java的构造函数详解,Java构造函数与普通函数用法详解
  9. html约束验证的例子,HTML5利用约束验证API来检查表单的输入数据的代码实例
  10. 泰坦尼克号数据_数据分析-泰坦尼克号乘客生存率预测