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
概述 描述 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.外观模式又称为门面模式,它是一 ...
随机推荐
- js前后五年的时间日期万年历
<script src='bootstrap/js/jquery-1.11.2.min.js'></script>//引入JQUERY文件<div> <sel ...
- day21 python之模块和包
一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...
- 【JavaScript】第8章读书笔记
本章常用的DOM方法 切记,页面的逻辑是:创建新的元素,给新的元素创建内容,通过appendChild把新元素的内容插入到新元素节点中:通过appendChild把新元素插入到已有元素节点中 书上的老 ...
- WCF基础二
1:地址 . WCf 的每一个服务都有一个唯一地址,地址包括传输协议和服务位置. HTTP:采用http\https协议进行传输,默认端口为80. TCP:采用ne.tcp协议进行传输,默认端口为80 ...
- 记自己利用hexo和github搭建个人博客的过程
--------------------------------------可能我书写的方式跟别人顺序不一样,但这是我的成功经验------------------------------------ ...
- NI_NUMERICHOST" is not exported by the Socket module "getaddrinfo" is not expo
[root@Server3 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf "NI_NUMERICHOST" is no ...
- Java 数据返回接口封装
enum StatusCode package com.lee.utils; public enum StatusCode { SUCCESS(20000, "成功"), FALL ...
- vue父组件给子组件传值:属性的形式
1.父组件怎么传值 2.子组件怎么接受值:依赖props 父页面定义的参数接收返回值,到子组件依旧用定义好的参数,在定义参数的类型,然后渲染数据
- 996.ICU与死亡因素
昨天,我为996.ICU这场国际运动贡献了一颗星. 关于这件事,第一想到的就是我们工作的初心是为了更好的生活,工作扼杀生活的不良风气应该坚决抵制. 查了一下,近些年人类正常死亡原因中排名前三的原因为: ...
- tee命令使用
需求描述: 今天在看nginx内容的过程,遇到了tee这个命令,所以查询了下,在这里记录下使用方法. 操作过程: 1.执行以下的命令 [root@testvm ~]# uname -n | tee h ...