关键词:
一、概念介绍
外观模式(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 }
【代码清单--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 }
【代码清单--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 }
然后是,门面类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类交互即可。
- 更好的划分访问层次
有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。
java设计模式之门面模式(外观模式)
医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊... 查看详情
门面模式(外观模式)
参考:http://www.cnblogs.com/java-my-life/archive/2012/05/02/2478101.html/DesignPatterns/src/com/louis/Facade/ModuleA.java/***ProjectName:DesignPatterns*FileName:ModuleA.java*PackageName:com.louis.Facade 查看详情
(转)java设计模式之门面模式(外观模式)
医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划... 查看详情
设计模式之门面模式(代码片段)
设计模式之门面模式 门面模式(FacadePattern)也叫外观模式,是一种常见的封装模式,定义:Provideaunifiedinterfacetoasetofinterfacesinasubsystem.Facadedefinesahigher-levelinterfacethatmakesthesubsystemeasiertouse.(要求一个 查看详情
设计模式之门面(外观)
医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号... 查看详情
java设计模式之门面模式(代码片段)
...个高层接口,让子系统更容易使用,属于结构型设计模式使用场景:为一个复杂的模式或者子系统提供一个简洁的供外界访问的接口希望提高子系统的独立性时当子系统由于不可避免的暂时原因导致可能存在BUG或者性... 查看详情
java设计模式之门面模式(代码片段)
...个高层接口,让子系统更容易使用,属于结构型设计模式使用场景:为一个复杂的模式或者子系统提供一个简洁的供外界访问的接口希望提高子系统的独立性时当子系统由于不可避免的暂时原因导致可能存在BUG或者性... 查看详情
设计模式之门面模式20170728
结构型设计模式之门面模式:一、含义门面模式也叫做外观模式,是一种比较常用的封装模式,其定义如下:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行,门面模式提供一个高层次的接口,使得子系统更... 查看详情
设计模式之门面模式(代码片段)
门面模式一:门面模式概述在现实世界中,外墙都在我们身边。操作系统就是这样一个例子-您没有看到计算机的所有内部工作方式,但操作系统提供了使用机器的简化界面。简而言之,门面模式旨在使事物看起来更清洁,更容... 查看详情
java设计模式—外观(门面)模式
定义 糅合功能,对外只提供一个入口。通过引进一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度。优点 1.低耦合:降低了客户... 查看详情
java设计模式—外观(门面)模式
定义 糅合功能,对外只提供一个入口。通过引进一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度。优点 1.低耦合:降低了客户... 查看详情
java设计模式之门面模式(代码片段)
...个高层接口,让子系统更容易使用,属于结构型设计模式使用场景:为一个复杂的模式或者子系统提供一个简洁的供外界访问的接口希望提高子系统的独立性时当子系统由于不可避免的暂时原因导致可能存在BUG或者性... 查看详情
java设计模式之外观学习与掌握(代码片段)
文章目录定义优点缺点模式结构与实现模式结构模式的实现模式应用场景定义外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该... 查看详情
常用设计模式之门面模式
门面模式也可以叫做外观模式 为子系统或者模块中的一组接口提供一个一致的访问方式,此模式定义了一个高层接口,这个接口使得各个子系统/模块中的功能 更加容易使用。 实际应用中,我们在对付一些老旧的代码或者即便... 查看详情
外观模式(门面模式)(代码片段)
文章目录外观模式(门面模式)示例相关的设计模式使用典范参考外观模式(门面模式)定义:它为子系统中的一组接口提供一个统一的高层接口。这一接口使得子系统更加容易使用类型:结构型适用场景... 查看详情
设计模式之外观模式(代码片段)
外观模式又叫门面模式,在平时的开发中使用的极其的频繁但是却非常的简单。使用外观模式可以让客户端轻松的调用复杂的系统接口,因为客户端根本不关心子系统的内部是如何实现的,他们只需要调用门面类提供的... 查看详情
结构性设计模式之门面模式(代码片段)
@TOC门面模式概述应用场景为复杂的模块或子系统提供外界访问的模块。子系统相对独立。预防额外操作带来的风险。目的优缺点优点:减少系统相互依赖。提高灵活性。提高安全性。缺点:不符合开闭原则,如果要改东西很麻... 查看详情
设计模式之外观模式
什么是外观模式?外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端... 查看详情