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类交互即可。
- 更好的划分访问层次
有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。
java设计模式之外观模式(门面模式)相关推荐
- java设计模式总结七:门面模式
门面模式定义 门面模式也称外观模式,门面模式实现了子模块和客户端之间的松耦合关系,从而屏蔽了子模块内部的实现细节.只是将客户端需要的接口提供给客户,这样一来子模块组件如果发生变化,修改接口就可以了,不 ...
- 外观模式 门面模式 Facade 结构型 设计模式(十三)
外观模式(FACADE) 又称为门面模式 意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统基本 ...
- 设计模式-外观模式(门面模式)
外观模式(门面模式) 外观模式介绍 定义 通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式. 该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大 ...
- 初探Java设计模式2:结构型模式(代理模式,适配器模式等)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...
- 初探Java设计模式3:行为型模式(策略,观察者等)
转自https://javadoop.com/post/design-pattern 行为型模式 策略模式 观察者模式 责任链模式 模板方法模式 状态模式 行为型模式总结 本系列文章将整理到我在Git ...
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
- Java设计模式(1)工厂模式(Factory模式)
工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...
- Java设计模式(10)代理模式(Proxy模式)
理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...
- 设计模式之禅【门面模式】
真刀实枪之门面模式 从投递信件说起 写过纸质信件没,如果你是00后,那机会应该很少,不过没关系,先来看看步骤 写信的内容 写信封 把信放到信封 投递到信箱中进行邮递 看下该过程的类图 趁热打铁,代码跟 ...
最新文章
- 洛谷——P3205 [HNOI2010]合唱队
- SQL 2005新增的几个函数之学习
- android 浏览文件夹,如何浏览android中的文件夹并获取所选文件夹的路径
- android 动态修改控件的宽高
- 分布式事务,EventBus 解决方案:CAP【中文文档】
- thinkphp mysql日志_MySQL的日志基础知识及基本操作学习教程
- Ubuntu将在明年推出平板及手机系统
- 想让马云成为你的老大?揭秘阿里面试情景
- 信息学奥赛一本通(1196:踩方格)
- macos 运行linux,MacOS 上运行shell
- Tomcat日志设置
- creo数控编程怎么样_creo3.0数控编程加工使用实例视频教程入门到精通 车床编程...
- 2021,属于Golang和Gopher的全新纪元
- 简述冯诺依曼计算机体系结构
- Linux环境下向github上传代码(生成token、生成本地密钥)
- 程序员520❤七夕情人节表白代码Html+Js+Css花瓣相册网页模板❤程序员表白必备...
- 屏幕撕裂及掉帧原因与解决方案
- 天图投资冲刺港股:资产管理规模249亿 投了小红书与奈雪
- 咱们的课程里,有微信的这种菜单示例吗?---酷课堂iOS交流群问答整理(201810期)...
- [2017纪中10-26]摘Galo 树型背包
热门文章
- C语言内存编址和寻址、内存对齐
- QT的QCheckBox类的使用
- 经典C语言程序100例之七
- 经典C语言程序100例之四
- django 不用自带的mysql_21_django配置使用mysql数据库的两种方式
- python中代理模式分为几种类型_代理模式
- JAVA无法加载此类文件,Java 7错误:无法加载本机库:ld.so.1:java:致命:libscf.so.1:打开失败:没有此类文件或目录...
- Python安装(Windows下安装/Linux下安装)
- 3socket编程:UDP编程
- Hibernate缓存和ehcache