Facade 设计模式
目的
- 在一个子系统的一组接口上提供一个统一的接口。Facade 设计模式定义了一个更高级别的接口,使子系统更容易使用。
- 通过一个更加简洁的接口来包装一个复杂的子系统。
解决的问题
客户端需要一个简化的接口来覆盖复杂的子系统的总体功能。
讨论
Facade 设计模式通过一个单一的接口对象来封装一个复杂的子系统。这样减少了学习子系统复杂的学习曲线。它也实现了不同潜在客户端的低依赖性和解耦。换句话说,如果Facade 是唯一访问子系统的入口,那么它将限制一些特性何灵活性,那样则可能需要所谓的高级用户。
Facade对象应该是一个相当简单的倡导者或是服务商。它不应该成为一个无所不知的圣人或“上帝”对象。
架构
Facade 采取了一种"被神秘的事物遮蔽起来的东西"的策略, 然后插入了一个包装器来驯服无形的神秘的一团软件.
SubsystemOne 与 SubsystemThree 并不与内部组件SubsytemTwo进行交互,而是通过 SubsystemTwoWrapper 这个 Facade(例如,更高层次的抽象)。
举例
Facade 定义了统一的,高层次的接口以便于非常容易地使用子系统。举例,顾客经常会遇到这样的问题,如从商品目录中订购产品。当用户拨打电话并向客户前台沟通时,这时客户前台便充当Facade的角色,她提供了一个接口去查询订单执行部门,账单部门和商品运送部门。
总结
- 为子系统或组件确定一个简单,统一的接口。
- 设计一个"wrapper"类来封装子系统。
- Facade或wapper封装了组件的协作何复杂性,并委托合适的方法。
- 客户端只能通过Facade访问子系统。
- 考虑额外的Facade是否会增加价值。
规则
Facade 定义了一个全新的接口,而适配器模式使用已存在的接口,适配器的目的是使两个存在的接口在一起工作而不是定义一个全新的接口。
享元模式用来展示多个小的对象,而Facade用单一对象来呈现整个子系统。
中介者模式与Facade类似,它是存在的class的一种抽象,抽象和集中任意同事对象之间的通信。它千篇一律的添加功能,并被同事对象所知和引用。相反,Facade 为子系统定义了一个简单的接口,它并不添加新的功能,并且不被子系统的类所知。
抽象工厂模式可以作为Facade的一种替代来隐藏平台指定的类。
Facade通常设计成单例模式因为只需要一个Facade对象。
适配器模式和Facade都使用了封装器,但他们属于不同的封装。Facade的目的是产生一个简单的接口,而适配器的目的是设计一个存在的接口。Facade通常用来封装多个对象而适配器模式封装一个对象。Facade可以设计一个从前台到后台一个单一复杂的对象而适配器模式封装系统存在的对象。
Facade 设计模式的更多相关文章
- 23种设计模式(1)-Facade设计模式
前记 曾经我遇见的一个需求是这样的,接口A有个方法void methodA(),类B需要实现接口A的methodA()方法,并且在类B中需要把methodA()方法内部处理逻辑获得的结果利用C类实例的 ...
- Facade设计模式
Facade模式 Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的Facade对象进行.Facade模式提供一个高层次的接口,使得子系统更易于使用. 就如同医院的接待员一样,Fac ...
- 了解facade设计模式
Facade模式 Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的Facade对象进行.Facade模式提供一个高层次的接口,使得子系统更易于使用. 就如同医院的接待员一样,Fac ...
- (转载)设计模式学习笔记(十一)——Facade外观模式
(转载)http://www.cnblogs.com/kid-li/archive/2006/07/10/446904.html Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户 ...
- C#设计模式之十一外观模式(Facade)【结构型】
一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...
- C#设计模式之十外观模式(Facade Pattern)【结构型】
一.引言 快12点半了,要开始今天的写作了.很快,转眼设计模式已经写了十个了,今天我们要讲[结构型]设计模式的第五个模式,该模式是[外观模式],英文名称是:Facade Pattern.我们先从名字上 ...
- C++设计模式 之 “接口隔离” 模式:Facade、Proxy、Mediator、Adapter
“接口隔离”模式 在组建构建过程中,某些接口之间之间的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接(稳定)接口,来隔离本来相互紧密关联的接口是一种常见的解决方案. 典型模式 #Facad ...
- c#设计模式之:外观模式(Facade)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
- 设计模式10: Facade 外观模式(结构型模式)
Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...
随机推荐
- Mysql中使用Group_Concat将列组合进来。
一.上例子: ) as CityId,group_concat(stationId) ,NameCn from `wd-area` where type='cn3k' and areaId like ...
- SHELL函数处理
SHELL函数调用分为两种: 第一种方式,有点像C语言调用函数的风格,直接把函数的执行结果复制给变量!不过,这个赋值过程和C语言的函数赋值是不一样的! C语言中,函数调用,是将函数的返回值返回给被调函 ...
- SSM实战——秒杀系统之Service层接口设计与实现、Spring托管、声明式事务
一:Service层接口设计 准备工作:新建三个包:service包.exception包.dto包,分别用来存放业务接口.自定义异常类.dto类. 1:定义接口 package org.myseck ...
- oracle批量更新之使用游标进行分批次更新的5种方式及速度比对
1.情景展示 一共有22w条数据, 需要将A表的主键更新至B表的指定字段,如何快速完成更新? 2.解决方案 声明: 解决方案不只一种,该文章只介绍快速游标法及代码实现: 两张表的ID和ID_CAR ...
- Mongodb对数据库(DB)的常用操作
1.查看所有库 show dbs 2.切换数据库/新建数据库 use mydb 3.查看当前库 db 需要注意的是:<use 新库>这个命令并不会马上建立真正的实体库,只有往里面插入数据的 ...
- 8、redis之事务1-redis命令
一.概述: 和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制.在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石.相信对有 ...
- excel单元格对齐方式
需要注意下面几点: 1.强制换行,ctrl+回车 2.快速设置缩进,当我们选择需要调整缩进的单元格之后,点击格式---单元格格式---选择水平对齐方式之后,可以选择缩进. 3.注意跨行居中功能,尤其是 ...
- 特殊字符导致json字符串转换成json对象出错
在对数据库取出来的数据(特别是描述信息)里面含有特殊字符的话,使用JSON.parse将json字符串转换成json对象的时候会出错,主要是双引号,回车换行等影响明显,左尖括号和右尖括号也会导致显示问 ...
- 【php】(转载)分享一个好用的php违禁词 处理类
1.直接上代码: <?php //定义编码 header( 'Content-Type:text/html;charset=utf-8 '); $words=array('我','你','他') ...
- JS中文转换(UTF-8),url传递中文乱码解决
来源于:http://blog.csdn.net/kuangfengbuyi/article/details/45557437 js合成url时,如果参数是中文,传到struts2中会乱码,解决办法如 ...