原文作者:Fina1ly

原文地址:java设计模式之外观模式(门面模式)

目录

一、概念介绍

二、角色及使用场景

三、实例

四、优点

  - 松散耦合

  - 简单易用

  - 更好的划分访问层次


一、概念介绍

  外观模式(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 Administrator8  *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 }

【代码清单--2】

 1 package com.huawei.facadeDesign.children;2 3 import org.apache.log4j.Logger;4 5 /**6  * Disk子系统类7  * @author Administrator8  *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 }

【代码清单--3】

 1 package com.huawei.facadeDesign.children;2 3 import org.apache.log4j.Logger;4 5 /**6  * Memory子系统类7  * @author Administrator8  *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 }

然后是,门面类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 }

最后为,客户角色。

【代码清单--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 }

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

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

四、优点

  - 松散耦合

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

  - 简单易用

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

  - 更好的划分访问层次

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

结构型模式—外观模式相关推荐

  1. Java设计模式之结构型:外观模式

    一.什么是外观模式: 外观模式通过对客户端提供一个统一的接口,用于访问子系统中的一群接口.使用外观模式有以下几点好处: (1)更加易用:使得子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要 ...

  2. JavaScript设计模式(三):结构型设计模式-外观模式、适配器模式、代理模式、装饰者模式、桥接模式、组合模式、享元模式

    JavaScript设计模式 - 结构型设计模式 套餐服务-外观模式 外观模式(Facade) 水管弯弯-适配器模式 适配器模式(Adapter) 适配异类框架 参数适配 牛郎织女-代理模式 代理模式 ...

  3. Java设计模式之结构型:组合模式

    前言: 我们对于上面两幅图片肯定非常熟悉,这两幅图片我们都可以看做是一个文件结构,对于这样的结构我们称之为树形结构.在数据结构中我们知道可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可 ...

  4. Java设计模式之结构型:代理模式

    前言: 我们一般在租房子时会去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做:再比如我们打官司需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们 ...

  5. Java设计模式之结构型:桥接模式

    一.什么是桥接模式: 桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯,桥接模式的作用就是为被分离的抽象部分和实现部分搭桥.在现实生活中一个物品在搭配不同的配件时会产生不同的动作和结果, ...

  6. 《设计模式详解》结构型模式 - 外观模式

    外观模式 5.5 外观模式 5.5.1 概述 5.5.2 结构 5.5.3 案例 5.5.4 使用场景 5.5.5 Tomcat 源码 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! ...

  7. 设计模式(18):结构型-享元模式(Flyweight)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  8. 结构型-享元模式-02-实例实现(围棋)

    结构型-享元模式-02-实例实现 1. 棋子抽象类(享元抽象类): 2. 白棋子(具体享元类): 3. 黑棋子(具体享元类): 4. 棋子坐标类(外部状态) 5. 享元工厂类 6. 客户端测试 7. ...

  9. 设计模式(装饰者模式外观模式代理模式)

    目录 装饰者模式 介绍 实现 外观模式 介绍 实现 代理模式 介绍 实现 装饰者模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设 ...

  10. php门面理解,php 门面模式(外观模式)

    header("content-type:text/html;charset=utf-8"); // ==================php 门面模式(外观模式) ====== ...

最新文章

  1. 2021年中国工业互联网安全大赛核能行业赛道writeup之隐写
  2. 阿里七层流量入口 Tengine硬件加速探索之路
  3. STM32F405的 ADC参考电压选择问题
  4. Hibernate 之单向多对一映射及其衍生问题
  5. Delphi中使用API将目录删除函数
  6. Spring源码之bean的加载(一)
  7. Google退出中国 Mark
  8. 斐讯k2php环境,斐讯K2 刷华硕固件 实现 单线复用(网络、IPTV走一根网线)
  9. Boot重抽样获取logistic回归内部验证AUC可信区间
  10. 基于PLC的智能化远程养殖监控系统
  11. navicat显示中文为问号
  12. MySQL主从复制bug记录
  13. 【分享】《小强升职记》读书笔记分享1
  14. [转]ActiveX控件去除IE警告框的方法
  15. 2011级《软件设计模式》考试试题(开卷)
  16. 使用RetroPie构建复古游戏机
  17. 计算机代码清单目录,搜索文件夹并生成目录清单
  18. 攒了一冬的甜,米易枇杷借力新电商走出川西大山
  19. 北京网站建设比较好的公司
  20. 聊聊金融机构的信息系统建设之投研一体化

热门文章

  1. 37-Invert Binary Tree
  2. 【转】Android中定时器的3种实现方法
  3. Asp.Net Mvc - 在OnResultExecut* 拦截Action返回的HTML
  4. ubuntu 12.04 配置LAMP
  5. 剑指Offer--数值的整数次方
  6. 1266: [AHOI2006]上学路线route
  7. C#语言实现定时开启或禁用网卡小程序
  8. view渐变色,透明度渐变
  9. 相关的类代表的颜色和文本对齐方式
  10. WinForm实现窗体最小化后小图标在右边任务栏下