1.意图

为子系统中的一组接口提供一个一致的接口,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

2.动机

将一个系统划分成若干子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖达到最小。达到该目标的途径之一是引入一个外观对象,它为子系统提供了一个统一的接口。

3.适用性

  • 当要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
  • 客户程序与抽象的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  • 当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。

4.结构

5.代码实例

//Facade.h
#include <memory> class House; class FacadeHouse
{
public:
FacadeHouse();
void Build(); private: std::shared_ptr<House> m_ptrHouse; };
//House.h
#include <string> class House
{
public:
House();
void Bulid();
void SetDoorColor(std::string sColor);
void SetFloorColor(std::string sColor);
void SetBedColor(std::string sColor); private:
std::string m_sDoorColor;
std::string m_sFloorColor;
std::string m_sBedColor; };
//Facade.cpp
#include "Facade.h"
#include "House.h" FacadeHouse::FacadeHouse()
{
m_ptrHouse = std::shared_ptr<House>(new House);
} void FacadeHouse::Build()
{
m_ptrHouse->Bulid();
}
//House.cpp

#include <iostream>
#include "House.h" House::House() :
m_sDoorColor("Red"),
m_sFloorColor("Red"),
m_sBedColor("Red")
{
} void House::Bulid()
{
std::cout<< "Build House with DoorColor: " << m_sDoorColor <<std::endl;
std::cout<< "Build House with FloorColor: " << m_sFloorColor <<std::endl;
std::cout<< "Build House with BedColor: " << m_sBedColor <<std::endl; } void House::SetDoorColor(std::string sColor)
{
m_sDoorColor = sColor;
} void House::SetFloorColor(std::string sColor)
{
m_sFloorColor = sColor;
} void House::SetBedColor(std::string sColor)
{
m_sBedColor = sColor;
}
//Client.cpp

#include <memory>
#include <iostream>
#include "House.h"
#include "Facade.h" int main()
{ std::cout<<"Facade Default House:" << std::endl;
std::shared_ptr<FacadeHouse> pFacadeHouse(new FacadeHouse);
pFacadeHouse->Build(); std::cout<<"User define house:" << std::endl; std::shared_ptr<House> pHouse(new House); pHouse->SetBedColor("Green");
pHouse->SetDoorColor("Green");
pHouse->SetFloorColor("Green"); pHouse->Bulid(); while(); }

6.测试结果

7.效果

  • 它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
  • 实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。
  • 如果应用需要,它并不限制它们使用子系统类。因此可以在系统易用性和通用性之间加以选择。

Facade(外观)-对象结构型模式的更多相关文章

  1. Facade 外观(结构型)

    Facade 外观(结构型) 一:描述: Facade 外观模式是为子系统至客户端之间提供简单的一致的接口,来降低耦合度. 二:模式图 三:实现代码简单例子: 1.业务模块: 2.外观接口: 3.客户 ...

  2. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  3. Bridge模式——对象结构型模式

    今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...

  4. Decorator(装饰)-对象结构型模式

    1.意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器 Wrapper. 3.动机 给某个对象而不是整个类添加一些功能.一个较为灵 ...

  5. Bridge(桥接)-对象结构型模式

    1.意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 2.动机 在抽象类与它的实现之间起到桥梁作用,使它们可以独立地变化. 3.适用性 不希望在抽象和它的实现部分之间有一个固定的绑定关系. ...

  6. Adapter(适配器)-类对象结构型模式

    1.意图 将一个类接口转换成客户希望的另外一个接口.Adapter模式使那些原本不能一起工作的类,可以一起工作. 2.别名 包装器 Wrapper. 3.动机 一个应用可能会有一些类具有不同的接口,并 ...

  7. Proxy(代理)-对象结构型模式

    1.意图 为其它对象提供一种代理以控制对这个对象的访问. 2.别名 Surrogate. 3.动机 通过Proxy可以达到对一个对象的访问控制. 4.适用性 远程代理  为一个对象在不同地址空间提供局 ...

  8. Flyweight(享元)--对象结构型模式

    1.意图 运用共享技术有效地支持大量细粒度的对象. 2.动机 Flyweight模式描述了如何共享对象,使得可以细粒度地使用它们,而无需高昂的代价.flyweight是一个共享对象,它可以同时在多个场 ...

  9. Composite(组合)--对象结构型模式

    1.意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.动机 可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成 ...

随机推荐

  1. Java值传递以及引用的传递、数组的传递!!

    转(http://blog.csdn.net/niuniu20008/article/details/2953785) 许多编程语言都有2种方法将参数传递给方法------按值传递和按引用传递. 与其 ...

  2. android 评分条 RatingBar 使用及自定义

    一.先上效果图片: 第一个是自定义: 第二个是原生的: 二.atingBar 介绍: RatingBar是基于SeekBar和ProgressBar的扩展,用星型来显示等级评定.使用RatingBar ...

  3. java 将字符串下载为文本文件

    通过url访问方法即可进行下载 @RequestMapping("down") public String down(HttpServletRequest request,Http ...

  4. hibernate复合主键

    需要用到实体类Role的主键和Menu的主键结合起来作为实体类RoleMenu的主键,那么通过Hibernate具体实现如下: RoleMenu实体类:(注意该实体类需要实现Serializable接 ...

  5. 新手上路,配置阿里云CentOS服务器LAMP

    最近出了个9.9包月的阿里云一直想弄就买了个半年的,脑子一热选了个CentOS系统的然后就是无尽的代码...... 话不多说直接上步骤:  在实例中选择"连接管理终端",输入一些应 ...

  6. STL容器适配器 stack, queue

    stack是一种后进先出(last in first out)的数据结构.它只有一个出口,如图所示.stack允许新增元素,删除元素,取得最顶端元素.但除了最顶端外,没有其他任何地方可以存储stack ...

  7. shell命令快捷键

    在shell命令终端中,Ctrl+n相当于方向向下的方向键,Ctrl+p相当于方向向上的方向键.   在命令终端中通过它们或者方向键可以实现对历史命令的快速查找.这也是快速输入命令的技巧.   在命令 ...

  8. Lucene的分析过程

    转自:http://www.open-open.com/lib/view/open1348033848724.html Lucene的分析过程 回顾倒排索引的构建 收集待建索引的原文档(Documen ...

  9. cnblogs,我回来了

    之前是在Github上搭了个博客,原因只有一个:可以弄个比较个性的域名,逼格高. 不过用起来倒是麻烦,一是经常纠结自己的主页是不是不够逼格?二就是身在墙内,访问速度不理想. 所以,还是安心的在这里,写 ...

  10. Windows 2008 R2 安装 Windows phone 7 开发环境

    安装环境:1.Windows server 2008 R22.Visual Studio 2010 SP1 旗舰版 1.下载 WP7 SDK 离线安装包.(话说要选择与 VS2010 相同语言的版本) ...