设计模式 - 门面模式(Facade Pattern,也叫外观模式)
简介
场景
- 将系统划分为若干个子系统有利于降低系统的复杂性,但是这会增加调用者的复杂性。通过引入 Facade 可以对调用者屏蔽系统内部子系统的细节。
- Java 中有多个日志库,例如 log4j、logback 等。此外,还有一个著名的日志门面库 SLF4j。需要打日志时,最佳做法是去调用 SLF4j,而不是直接调用 log4j 等具体的日志库。
电商企业
电商企业有订单部门、物流部门、结算部门。
当消费者打客服电话时,只跟客服代表通话,客服代表充当 Facade,代替客户获取相关子部门的信息。
分层的系统
对于复杂系统,分层设计可以提高灵活性和可替换性。
可以用外观模式定义系统中每一层的入口,使得层与层之间不直接产生联系,降低层之间的耦合度。
模式定义
外部与一个系统中所有子系统的通信必须通过一个统一的 Facade 对象进行,为子系统中的接口提供统一的界面,使子系统更加易用。
门面模式也叫外观模式。
模式特点
门面模式包含两个角色:
- Facade:门面
- SubSystem:子系统
优点
- 统一入口,客户端不需要了解系统细节,操作简单
- 降低了子系统与客户之间的耦合关系,子系统内部实现变化时,不影响客户端
缺点
- 用户可以绕过 Facade 门面类直接访问子系统,无法把控
- 不引入抽象外观类时,增加新的子系统可能需要修改外观类或客户端,违背“开闭原则”
PHP 代码示例
<?php
class Facade {
private $a;
private $b;
public function __construct() {
$this->a = new SystemA();
$this->b = new SystemB();
}
function wrapOperation() {
$this->a->funcA();
$this->b->funcB();
}
}
class SystemA {
public function funcA() {
echo "funcA".PHP_EOL;
}
}
class SystemB {
public function funcB() {
echo "funcB".PHP_EOL;
}
}
echo '<pre>';
$facade = new Facade();
$facade->wrapOperation();
输出:
funcA
funcB
设计模式 - 门面模式(Facade Pattern,也叫外观模式)的更多相关文章
- 设计模式系列之外观模式(Facade Pattern)——提供统一的入口
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)
在此先容我拿“小弟”这个词来扯一下淡.什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿“小弟”来类比“外观模式”.在上面一篇博文我们完整的介绍了“适配器模式”,接下来我们将要在这篇博客 ...
- 二十四种设计模式:外观模式(Facade Pattern)
外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...
- 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
- python : 设计模式之外观模式(Facade Pattern)
#为啥要用外观模式举例说明 这个例子很形象,直接从人家博客上贴过来的,参考链接在下面 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶.茶具和开水,如图1(A)所示,而 ...
- 【UE4 设计模式】外观模式 Facade Pattern
概述 描述 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一 ...
- C#设计模式——外观模式(Facade Pattern)
一.概述 在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便.这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象, ...
随机推荐
- Gradle -- 初体验
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置. ...
- Dijkstra经典算法注意点
Dijkstra经典算法注意点 前言 迪杰斯特拉算法,经典模板如下: void dij(int s) { for(int i=1; i<=n; i++) dis[i]=road[s][i]; v ...
- Djaon 基于 Ajax 的 json 数据传输
关键参数:contentType:"application/json" data:JSON.stringify({ json数据 }) 再views.py中,使用request.d ...
- python学习第四十二天列表生成式用法及作用
在操作列表或者元组的时候,对一系列的数据进行算法,比较整个数据加1,或翻倍,用传统的算法就很繁琐,列表给我们提供简便的方法 a=[i*i for i in rang(10)] a=[1,4,9,16, ...
- python实现一个简单的网络聊天程序
一.Linux Socket 1.Linux Socke基本上就是BSD Socket(伯克利套接字) 伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信.B ...
- [书接上一回]在Oracle Enterprise Linux (v5.7) 中安装DB - (2/4)
在最后一行,书写shmfs /dev/shm tmpfs size=2g 0 用来调高数据库运行是的内存分配问题. 创建需要的路径和分配权限. 设置 oracle 用户环境参数. 修改标头显示的部分. ...
- ASE Beta Sprint - backend scrum 1
本次scrum于2019.12.2与前端组和模型组一起在sky garden进行,持续50分钟. 参与人: Xin Kang, Zhikai Chen, Lihao Ran, Hao Wang 请假: ...
- Taro -- 微信小程序登录
Taro微信小程序登录 1.调用Taro.login()获取登录凭证code: 2.调用Taro.request()将code传到服务器: 3.服务器端调用微信登录校验接口(appid+appsecr ...
- js函数总结
最近要经常写一些Js代码,总看到同事能使用js高级函数写出比较简洁的js代码,挺羡慕的,于是就花了一些专门时间来学习. forEach.map.reduce 我就不喜欢一上来就给出语法来,先来一个例子 ...
- python3-返回函数
函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = ...