java设计模式之外观模式(门面模式)
2017-03-01 15:22
387 查看
针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下。
![](https://images2015.cnblogs.com/blog/1016421/201609/1016421-20160910215031051-160598096.png)
简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。
1).门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
2).子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。
3).客户角色:通过调用Facede来完成要实现的功能。
2- 子系统相互独立;
3- 在层析结构中,可以使用外观模式定义系统的每一层的入口。
每个Computer都有CPU、Memory、Disk。在Computer开启和关闭的时候,相应的部件也会开启和关闭,所以,使用了该外观模式后,会使用户和部件之间解耦。如:
![](https://images2015.cnblogs.com/blog/1016421/201609/1016421-20160910220858113-1558521390.png)
![](https://images2015.cnblogs.com/blog/1016421/201609/1016421-20160910223141676-1747267903.png)
代码实现
首先是子系统类:
【代码清单--1】
【代码清单--2】
【代码清单--3】
然后是,门面类Facade
【代码清单--4】
最后为,客户角色。
【代码清单--5】
【代码清单--6】运行结果
![](https://images2015.cnblogs.com/blog/1016421/201609/1016421-20160910225758848-554310989.png)
从上面的实例来看,有了这个Facade类,也就是Computer类,用户就不用亲自去调用子系统中的Disk,Memory、CPU类了,不需要知道系统内部的实现细节,甚至都不用知道系统内部的构成。客户端只需要跟Facade交互就可以了。
一、概念介绍
外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。二、角色及使用场景
![](https://images2015.cnblogs.com/blog/1016421/201609/1016421-20160910215031051-160598096.png)
简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。
1).门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
2).子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。
3).客户角色:通过调用Facede来完成要实现的功能。
使用场景:
1- 为复杂的模块或子系统提供外界访问的模块;2- 子系统相互独立;
3- 在层析结构中,可以使用外观模式定义系统的每一层的入口。
三、实例
下面,我们就通过一个简单的例子来实现该模式。每个Computer都有CPU、Memory、Disk。在Computer开启和关闭的时候,相应的部件也会开启和关闭,所以,使用了该外观模式后,会使用户和部件之间解耦。如:
![](https://images2015.cnblogs.com/blog/1016421/201609/1016421-20160910220858113-1558521390.png)
包体的创建:
![](https://images2015.cnblogs.com/blog/1016421/201609/1016421-20160910223141676-1747267903.png)
代码实现
首先是子系统类:
【代码清单--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】运行结果
![](https://images2015.cnblogs.com/blog/1016421/201609/1016421-20160910225758848-554310989.png)
从上面的实例来看,有了这个Facade类,也就是Computer类,用户就不用亲自去调用子系统中的Disk,Memory、CPU类了,不需要知道系统内部的实现细节,甚至都不用知道系统内部的构成。客户端只需要跟Facade交互就可以了。
四、优点
- 松散耦合
使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;- 简单易用
客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。- 更好的划分访问层次
有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。相关文章推荐
- Java设计模式(十一):外观模式(门面模式)Facade
- 设计模式读书笔记之外观模式/门面模式(Facade)
- 外观模式/门面模式
- 小猪学设计模式——门面模式(外观模式)
- java设计模式(结构型)之外观模式
- 设计模式初探-外观模式(FACADE)也叫门面模式
- 11. Facade外观[门面模式](结构型模式)
- 学习设计模式第十三 - 外观模式(门面模式)
- 外观模式或门面模式
- JAVA设计模式十八:--Facade(外观模式或门面模式)
- JAVA设计模式之门面模式(外观模式)
- 模版方法、迪米特法则、外观模式(门面模式)
- 我看懂的设计模式 Facade,外观模式/门面模式
- 外观模式/ 门面模式(Facade Pattern)
- 设计模式之 外观(门面)模式 Facade
- 门面模式(外观模式):Facade
- 关于三层架构 = 门面模式/外观模式
- 外观/门面模式(Facade)
- java读书笔记-《java设计模式》-第4章 - 外观模式
- 外观模式(门面模式)