Facade模式

Facade模式
  一、概述
  Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用。
  实际应用中,我们在对付一些老旧的code(尤其是将C的代码转成C++代码)或者即便不是老旧code,但涉及多个子系统时,除了重写全部代码(对于老旧code而言),我们还可能采用这样一种策略:
  重新进行类的设计,将原来分散在源码中的类/结构及方法重新组合,形成新的、统一的接口,供上层应用使用。
  这在某种意义上与Adapter及Proxy有类似之处,但是,Proxy(代理)注重在为Client-Subject提供一个访问的中间层,如CORBA可为应用程序提供透明访问支持,使应用程序无需去考虑平台及网络造成的差异及其它诸多技术细节;Adapter(适配器)注重对接口的转换与调整;而Facade所面对的往往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统一的接口/界面。
  三、应用
  在遇到以下情况使用Facade模式:
  1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。
  Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
  2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  3、当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点,如果子系统之间是相互依赖的,你可以让它们仅通过Facade进行通讯,从而简化了它们之间的依赖关系。
  四、优缺点
  Facade模式有下面一些优点:
  1、它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
  2、它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。
  松耦合关系使得子系统的组件变化不会影响到它的客户。Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。Facade模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候尤为重要。
  在大型软件系统中降低编译依赖性至关重要。在子系统类改变时,希望尽量减少重编译工作以节省时间。用Facade可以降低编译依赖性,限制重要系统中较小的变化所需的重编译工作。Facade模式同样也有利于简化系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。
  3、如果应用需要,它并不限制它们使用子系统类。因此你可以在系统易用性和通用性之间加以选择。

转载于:https://www.cnblogs.com/wangzhuangye/archive/2009/02/06/1385010.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ceph启动脚本

放在/etc/init.d/目录下,用法如下: 1 rootu253:~# /etc/init.d/ceph 2 mon.a 3 usage: /etc/init.d/ceph [options] {start|stop|restart} [mon|osd|mds]... 4 -c ceph.conf 5 --valgrind run via valgrind 6 --hostname [hostname] …

全修CALL

PUSH -1PUSH 0PUSH 0CALL 005A8690ADD ESP,0Cbp send,点全修CTRLf9一直返回到没有参数 基本上这个返回就是 功能CALL 0012EB08 005869B2 返回到 elementc.005869B2 来自 elementc.0058E8A00012EB1C 00588B1F 返回到 elementc.00588B1F 来自 elementc.005869800012EB28 …

.NET框架类库中的命名空间

.NET 框架类库是一个由 Microsoft .NET 框架 SDK 中包含的类、接口和值类型组成的库。 该库提供对系统功能的访问,并且被设计为 .NET 框架应用程序、组件和控件的生成基础。 .NET 框架类库提供下列命名空间: l Microsoft.CSharp 包含支持用 C# 语言进行…

OSChina 周六乱弹 —— 这个版本的小红帽听说过吗?

2019独角兽企业重金招聘Python工程师标准>>> 想想当年刚出来工作的时候,小小编还真是单纯,以为广阔天地大有作为,可是呢。。。 上热门:刚出来工作的时候,大人千叮万嘱社会很复杂,要学会控制自己…

XML解析

一、解析xml的两种方式 1、 其中,xml文件被解析之后产生的dom树可能是原xml文件内存的成千上万倍,所以占内存;一般是服务器端; 2、sax逐行读取解析的方式,读一行释放一行,移动端采用; 其中&…

Arcgis Server初学笔记(一)

什么是Arcgis Server(以下简称AS)? AS是一个基于web的企业级GIS解决方案。AS为创建和管理基于服务器的GIS应用提供了一个高效的框架平台。AS宿主了各种GIS资源,并把他们作为服务发送到客户端。Accgis Server架构 AS是一个分布系统,…

XML解析——Jsoup解析器

一、Jsoup解析器快速入门案例 Docement对象,文本对象,包含着各个Dom树结构 1、引入Jsoup解析器的jar包放在lib文件夹下后,写java代码 其中, 二、Jsoup对象 1、Jsoup解析器解析xml和html的有关对象 其中,通过统计资源定…

Linux下MPlayer的安装

Linux下MPlayer的安装 收藏 mplayer是linux下播放速度最快(正确安装了显卡驱动),支持媒体格式最多的播放器之一 ,它几乎能播放所有的win媒体文件!下面介绍它的安装方法: 安装大前提: 要编译这个软件,确认你系统安装了相应的XFree…

jQuery缓存数据——仿Map

2019独角兽企业重金招聘Python工程师标准>>> 最近在工作中遇到了这样一个情景。有些数据是从后台读取的,但是我暂时不需要展示在页面上,那怎么办呀?——缓存呀。今天我就来分享一下我所了解的Jquery缓存数据的方法。 首先分享1篇博…

【摘抄】百度分词算法详解:查询处理以及分词技术

随着搜索经济的崛起,人们开始越加关注全球各大搜索引擎的性能、技术和日流量。作为企业,会根据搜索引擎的知名度以及日流量来选择是否要投放广告等;作为 普通网民,会根据搜索引擎的性能和技术来选择自己喜欢的引擎查找资料&#x…

Jsoup快速查询

一、selector选择器 二、Xpath查询 转载于:https://www.cnblogs.com/wmqiang/p/11568184.html

ShellAPI 调用搜索引擎

//调用搜索引擎 uses ShellAPI;//google web searchprocedure TForm1.Button1Click(Sender: TObject);var SearchStr:PWideChar; SearchEngineStr:string;begin SearchEngineStr:http://search.yahoo.com/search?p; SearchStr:PWideChar(SearchEngineStr Edit1.Text); …

read name 和 read 在 Bash 中的区别

read 带一个参数和不带参数的区别是什么,我本以为仅仅是被赋值的变量的名字不同而已: $ read name 1 $ echo "$name" 1 $ read 1 $ echo "$REPLY" 1 当没有指定变量名时,read 会给默认的变量 REPLY 赋值,仅此…

李开复:2009地图与移动搜索快速增长

新浪科技讯 2月20日下午消息,谷歌大中华区总裁李开复今日召开媒体见面会,探讨谷歌2009年的发展重点和方向,李开复称地图与移动搜索将会迅速成长。以下为文字实录: 李开复:Google每次有员工大会,会把在北京、…

Qt SD卡 文件系统挂载、文件预览

/*********************************************************************************** Qt SD卡 文件系统挂载、文件预览* 声明:* 1. 验证挂载SD卡;* 2. QTreeView显示文件系统文件;* 3. UI线程、普通…

c# 文件压缩、解压及下载

C#打包文件夹成zip格式(包括文件夹和子文件夹下的所有文件) C# 文件压缩与解压(ZIP格式) asp.net实现文件夹及文件压缩,并实现下载转载于:https://www.cnblogs.com/myparamita/archive/2012/06/04/2534206.html

Servlet生命周期和方法

一、五个生命周期方法,有三个很重要,初始化方法、提供服务方法和销毁方法 1、三个主要方法 2、另外两个重写的成员方法只做了解 二、生命周期详解 其中,每次刷新页面都是一次对servlet访问; 页面访问,根据域名找到主机…

如何查看端口被占用

最近在做有关WCF的系统,可能是在方法回调的过程中会默认通过TCP:80端口,报错为80端口被占用,然而我又不知道什么程序占用了80端口,上网一找,没想真不少人碰到我一样的问题,嘿嘿。 run "net…

centos7 搭建Docker Registry

registry2.x版本比1版本的速度快而且加了认证环境规划&#xff1a;192.168.0.167Registry192.168.0.168client192.168.0.1671.安装并启动docker#添加yum源 [rootRegistry ~]# sudo tee /etc/yum.repos.d/docker.repo <<-EOF [dockerrepo] nameDocker Repository baseurl …

Servlet3.0注解配置访问路径和urlParttern配置

一、Servlet用注解配置访问路径 二、IDEA的tomcat相关配置 其中&#xff0c;第一点的配置文件&#xff0c;直接在IDEA的可视化操作界面修改就可以改掉配置文件中内容&#xff1b; 三、urlParttern配置 其中&#xff0c;* 时通配符&#xff0c;优先级最低&#xff1b; 转载于:ht…