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. Redis 配置文件

    # Redis configuration file example. # # Note that in order to read the configuration file, Redis mus ...

  2. 造轮子之数据库对比工具DataBaseComparer

    最近同时在维护好几个项目,有些项目是SqlServer的,另一些是MySql的,DBA推荐了一个线上库和线下库的对比工具,用的时候经常会在对比时,半天都没有进度.索性自己这次造个轮子,做了一个纯对比数 ...

  3. Nodejs创建客户端

    Node 创建 Web 客户端需要引入 http 模块,创建 client.js 文件,代码如下所示: var http = require('http'); //用于请求的选项 var option ...

  4. SQLAlchemy模型使用

    SQLAchemy模型使用 简介: SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用 ...

  5. PostgreSQL 在centos 7下的安装配置

    安装postgresql: sudo yum install postgresql-server 初始化数据库: sudo postgresql-setup initdb 启动数据库: sudo sy ...

  6. C++读入XML文件

    最近要做一个VRP的算法,测试集都是放在Xml文件中,而我的算法使用C++来写,所以需要用C++来读取Xml文件. 在百度上搜"C++读取Xml文件",可以出来很多博客,大多数是关 ...

  7. 超牛的VS菜单

    所有菜单都重复了,Google到了解决办法:devenv /resetuserdata 但好不容易装好额ReSharper又不见了

  8. 2、python,for..in语句

    for..in语句是循环语句,它迭代一个对象的序列,例如经历序列中的第一项.一个序列只是一个有序的项目的集合. for i in range(1, 5): print(i) else: print(' ...

  9. PLC M8000 M8001 M8002 M8003

  10. VUE 入门基础(3)

    三,模板语法 Vue将模板编译成虚拟DOM渲染函数,结合响应系统,在应用状态改变时,vue能够智能地计算出重新渲染组件的最小代价并DOM操作上. 插值,文本 数据绑定常见的形式就是使用"Mu ...