8.4 GOF设计模式三: 外观模式 Facade
GOF设计模式三: 外观模式 Facade
“现有系统”功能强大、复杂,开发“新系统”需要用到其中一部分,但又要增加一部 分新功能,该怎么办?
4.1 Facade Pattern: Key Features
Intent
You want to simplify how to use an existing system. You need to define your own interface.
现有系统的接口比较复杂,你希望利用原有的功能重新定义新的接口
Problem
You need to use only a subset of a complex system. Or you need to interact with the system in
a particular way.
如果只希望使用现有系统的部分功能、或者以一 种特殊的方式与现有系统交互
Solution
The Facade presents a new interface for the client of the existing system to use.
外观模式提供一套新的接口供客户使用现有系统
Participants and collaborators
It presents a simplified interface to the client that makes it easier to use.
它呈 现给客户一套简单地接口,易于使用。
Consequences
The Facade simplifies the use of the required subsystem. However, because the Facade is
not complete, certain functionality may be unavailable to the client.
现有系统的部分功能,客户可能会不可用
Implementation
Define a new class (or classes) that has the required interface. Have this new class use the
existing system.
新定义的类,使用了现有系统的功能 ,为客户提供所需要的接口
4.1 Facade Pattern: Key Features
动机 Motivation
最小化通信 Minimize communication
最小化依赖 Minimize dependencies
4.2 外观模式的比喻 Non-software examples
例如,贸易公司的客户通过目录下订单,就类似一个“外观模式
客户联系公司的客户联系代表
客户联系代表 就作为“外观”,为客户提供接口,完成下单、付费、运 输等公司内部复杂的功能
客户很轻松完成任务
4.3 外观模式与适配器模式的比较
外观定义了新的接口,适配器使用旧的接口
Facade defines a new interface, whereas Adapter uses an old interface
适配器使得两个不一致的接口协同工作,而不是定义一个新的
Adapter makes two existing interfaces work together as opposed to defining an entirely new one
外观模式的本意是产生一个轻便的接口,适配器的本意是把现有的接口转换 一下
The intent of Facade is to produce a simpler interface, and the intent of Adapter is to design to
an existing interface
一个外观接口可能包装了多个现有系统的对象、也可能增加了一些新功能, 而适配器只是包装一个对象 While Facade routinely wraps multiple objects and Adapter wraps a single object
多数情况下,外观是单实例的
Facade objects are often Singletons because only one Facade object is required
GRASP原则的外观控制器,就是外观模式
4.4 适用性 Applicability
简化复杂系统的使用 Provide a simple interface to a complex subsystem
You do not need to use all the functionality of a complex system and can create a new class
that contains all the rules for accessing that system
If this is a subset of the original system, as it usually is, the API that you create for the new
class should be much simpler than the original system's API
在使用复杂系统的某个功能时,可以加入新功能
You want to use the functionality of the original system and want to add some new functionality as well
为客户软件层提供一个接口,隐藏了现有系统的细节
Provide an interface to a software layer
You want to encapsulate or hide the original system
使客户与现有系统之间减少耦合、增加独立性、可移植性
节约成本
开发新的外观类的成本,要比每个人都去熟悉现有系统、了解如何使用现有系统的功能 要节省许多
8.4 GOF设计模式三: 外观模式 Facade的更多相关文章
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 二十四种设计模式:外观模式(Facade Pattern)
外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...
- 设计模式之外观模式(Facade)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- [设计模式] 10 外观模式 facade
外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来.客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构. ...
- 设计模式 笔记 外观模式 Facade
//---------------------------15/04/16---------------------------- //Facade 外观模式-----对象结构型模式 /* 1:意图: ...
- 【设计模式】—— 外观模式Facade
前言:[模式总览]——————————by xingoo 模式意图 外观模式主要是为了为一组接口提供一个一致的界面.从而使得复杂的子系统与用户端分离解耦. 有点类似家庭常用的一键开关,只要按一个键,台 ...
- 结构型设计模式之外观模式(Facade)
结构 意图 为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 适用性 当你要为一个复杂子系统提供一个简单接口时.子系统往往因 ...
- python : 设计模式之外观模式(Facade Pattern)
#为啥要用外观模式举例说明 这个例子很形象,直接从人家博客上贴过来的,参考链接在下面 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶.茶具和开水,如图1(A)所示,而 ...
- 【UE4 设计模式】外观模式 Facade Pattern
概述 描述 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一 ...
随机推荐
- 迷宫问题 (bfs广度优先搜索记录路径)
问题描述: 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...
- mutex,thread
//#include <stdio.h> //#include <stdlib.h> //#include <unistd.h> #include <wind ...
- Gvim:unable to load python
环境 系统win7 64 bit 软件: Gvim8.1 : MS-Windows 32bit 软件: python2.7.14 windows 64bit 问题 点击打开Gvim时,提示:unabl ...
- 理解linux网络管理命令
linux 管理命令,iproute 查看帮助文件: man ip 以下为常用帮助文件. SEE ALSO ip-address(), ip-addrlabel(), ip-l2tp(), ip-li ...
- mysql 5.7 配置文件说明
1.配置文件样例 [client] #password= socket=/data/var/mysql/mysql.sock [mysqld_safe] pid-file=/data/var/mysq ...
- Cannot locate BeanDefinitionParser for element [scoped-proxy]
指定使用 CGLIB 而不使用 JDK 生成代理对象:注意:此两个标签必须同时出现,不然会报:Cannot locate BeanDefinitionParser for element [scope ...
- 20175205 2018-2019-2 《Java程序设计》第五周学习总结
20175205 2018-2019-2 <Java程序设计>第五周学习总结 教材学习内容总结 接口:使用关键字interface定义接口 接口声明:interface 接口名 接口体:接 ...
- svn与cvs的一些比较
所有的文档都显示SVN可以取代CVS,同时SVN的问题和缺点都被隐藏了.不幸的是,我们并不认为SVN是CVS的替代品,尽管很多缺陷都被修改了.更有甚者,它甚至让人重回VSS.CVS和SVN的比较类似与 ...
- quill富文本编辑器 API
//1. 从第三个开始删除,删除4个 // console.log(this.quill.deleteText(2, 4)); // 12345678 1278 // 2.(返回对象)返回从第三个开始 ...
- Spark大型电商项目实战-及其改良(3) 分析sparkSQL语句的性能影响
之前的运行数据被清除了,只能再运行一次,对比一下sparkSQL语句的影响 纯SQL的时间 对应时间表 th:first-child,.table-bordered tbody:first-child ...