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
概述 描述 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一 ...
随机推荐
- mysql获取连接connection失败
好久不写jdbc了,今天写了个小东西,数据库连接失败,错误信息如下: java.sql.SQLException: The server time zone value '???ú±ê×??±??' ...
- Grid move
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 25 range打印100到0的连续整数
使用range打印100,99,98,...0for i in range(100,-1,-1): print(i)
- Tomcat部署-端口、项目名称
端口: 将Connector的8080端口换成,电脑网页服务的80端口 项目名称 直接再 Host 中添加 <Context path="/" docBase="s ...
- Linux常用命令大全(非常全!!!)(转)
最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大.我将我了解到的命令列举一 ...
- CLASS类继承
单继承:# class People: 经典类class People(object): #新式类 def __init__(self,name,age,n=1000): self.name = na ...
- C#winform窗体利用系统抓取关闭按钮事件
const int WM_SYSCOMMAND = 0x112; const int SC_CLOSE = 0xF060; const int SC_MINIMIZE = ...
- 2018-2019-2 网络对抗技术 20165305 Exp6 信息搜集与漏洞扫描
1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具 ...
- springmvc整合swagger
前言 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...
- 【MySQL】InnoDB 内存管理机制 --- Buffer Pool
InnoDB Buffer Pool 是一块连续的内存,用来存储访问过的数据页面 innodb_buffer_pool_size 参数用来定义 innodb 的 buffer pool 的大小 是 M ...