设计模式---接口隔离模式之门面模式(Façade)
前提:接口隔离模式
在组建构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接接口(稳定的),来隔离本来相互紧密关联的接口是一种常见的解决方案。
典型模式:
门面模式:Façade,
代理模式:Proxy,
适配器模式:Adapter,
中介者模式:Mediator
一:门面模式(外观模式)
(一)概念
Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。
Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。
为子系统中统一一套接口
(二)动机
上述方案A的问题在于组件的客户和组件中的各种复杂的子系统有了过多的耦合,随着外部客户程序和子系统的演化,这种过多的耦合面临很多变化的挑战。
如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦。
(三)系统间耦合的复杂度

(四)模式定义
为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。
--《设计模式》Gof
(五)结构(没有特定的模式)

不同场景,变化相差较大
(六)要点总结: (将子系统的变化限制在一个范围内)
1.从客户程序的角度来看, Façade 模式简化了整个组件系统的接口。对于内部和外部客户程序来说, Façade 模式实现了一种解耦的效果——即内部的子系统的任何变化不会影响到 Façade 接口的变化。
2.Façade 设计模式更注重从架构的层次去看待整个系统,而不是单个类的层次。Façade 很多时候更是一种架构设计模式。
3.Façade 设计模式并非是一个集装箱,可以任意的放入任何多个对象。Facade模式中组件的内部应该是“相互耦合关系比较大的一系列组件”,而不是简单的功能集合,以便能够实现松耦合,高内聚的特性。
(七)案例实现:子系统接口统一
#include <iostream>
using namespace std; //子系统组成,各个部分关系较大的一系列组件
class SystemA
{
public:
void doThing()
{
cout << "systemA do..." << endl;
}
}; class SystemB
{
public:
void doThing()
{
cout << "SystemB do..." << endl;
}
}; class SystemC
{
public:
void doThing()
{
cout << "SystemC do..." << endl;
}
};
class Facade
{
private:
SystemA* a;
SystemB* b;
SystemC* c;
public:
Facade()
{
a = new SystemA();
b = new SystemB();
c = new SystemC();
} ~Facade()
{
delete[] a;
delete[] b;
delete[] c;
} void doThing() //接口提供稳定,降低耦合,提高内聚
{ //统一接口中没有必须按照某种步骤,不要把建造者模式混淆
a->doThing();
b->doThing();
c->doThing();
}
};
void main()
{
Facade* f = new Facade();
f->doThing();
delete f; system("pause");
return;
}

(七)案例实现:基金购买方案
#include <iostream>
using namespace std; class Fund
{
public:
virtual void purchase() = ;
virtual ~Fund(){}
}; class ForeignExchange :public Fund
{
public:
virtual void purchase()
{
cout << "purchase foreign exchange" << endl;
}
}; class Futures :public Fund
{
public:
virtual void purchase()
{
cout << "purchase futures" << endl;
}
}; class Shares :public Fund
{
public:
virtual void purchase()
{
cout << "purchase shares" << endl;
}
}; class NationalDebt :public Fund
{
public:
virtual void purchase()
{
cout << "purchase national debt" << endl;
}
};
class PurFacade
{
private:
ForeignExchange* fe;
Shares* s;
Futures* f;
NationalDebt* nd;
public:
PurFacade()
{
fe = new ForeignExchange();
s = new Shares();
f = new Futures();
nd = new NationalDebt();
} void Interface1()
{
fe->purchase();
s->purchase();
} void Interface2()
{
fe->purchase();
f->purchase();
} void Interface3()
{
fe->purchase();
nd->purchase();
} //...多种接口
};
void main()
{
PurFacade* pf = new PurFacade(); pf->Interface1();
pf->Interface3(); system("pause");
return;
}

设计模式---接口隔离模式之门面模式(Façade)的更多相关文章
- 设计模式---接口隔离模式之适配器模式(Adapter)
一:概念 通过Adapter模式可以改变已有类(或外部类)的接口形式 二:动机 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不 ...
- java设计模式5.组合模式、门面模式、享元模式、桥接模式
组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...
- Java设计模式(一)外观模式(门面模式)- 结构型模式
模式的定义 门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式,其定义如下:要求一个子系统的外部与其内部通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得 ...
- Java设计模式之(九)——门面模式
1.什么是门面模式? Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher ...
- Java设计模式(12)——结构型模式之门面模式(Facade)
一.概述 概念 简要示意图(没有一个统一的UML图) 角色 门面角色:门面模式核心,它被客户端调用,并且熟悉子系统 子系统角色:子系统,子系统并不知道门面的存在,门面对它来说只不过是另外一个客户端 ...
- 23种设计模式 - 接口隔离(Facade - Proxy - Mediator - Adapter)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 接口隔离 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接( ...
- 外观模式(Facade)(门面模式、子系统容易使用)
外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式.该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低 ...
- 深入 Laravel 内核之外观模式(门面模式)
门面模式核心内容: 客户端与子系统的通信通过外观对象进行: 外观对象封装一系列子系统的具体对应方法,对客户端只需暴露一个单一的入口方法: 客户端通过访问外观对象即可调用子系统的基础方法,无需关心子系统 ...
- 设计模式---接口隔离模式之中介者模式(Mediator)
一:概念 在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互.Mediator对象起到控制器的作用 二:动机 在软件构建的过程中, ...
随机推荐
- 微信小程序——创建自己的第一个小程序【一】
注册 微信小程序注册 https://mp.weixin.qq.com/wxopen/waregister?action=step1 填写账号信息 作为登录帐号,请填写未被微信公众平台注册,未被 ...
- ZOJ 3846 GCD Reduce//水啊水啊水啊水
GCD Reduce Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge You are given a sequ ...
- Apache 跟踪用户会话
打开usertrack_module LoadModule usertrack_module modules/mod_usertrack.so 配置跟踪选项 <IfModule usertrac ...
- 《App后台开发运维与架构实践》第2章 App后台基础技术
2.1 從App業務邏輯中提煉API接口 業務邏輯思維導圖 功能-業務邏輯思維導圖 基本功能模塊關系 功能模塊接口UML(設計出API) 在設計稿標注API 編寫API文檔 2.2 設計API的要點 ...
- 滚动ListView时图像顺序混乱
本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术.本文将为读者讲解滚动ListView时图像顺序混 ...
- Codeforces 1079D Barcelonian Distance(计算几何)
题目链接:Barcelonian Distance 题意:给定方格坐标,方格坐标上有两个点A,B和一条直线.规定:直线上沿直线走,否则沿方格走.求A到B的最短距离. 题解:通过直线到达的:A.B两点都 ...
- luogu1397 [NOI2013]矩阵游戏 (等比数列求和)
一个比较显然的等比数列求和,但有一点问题就是n和m巨大.. 考虑到他们是在幂次上出现,所以可以模上P-1(费马小定理) 但是a或c等于1的时候,不能用等比数列求和公式,这时候就要乘n和m,又要变成模P ...
- day15-集合
快捷键: 先定义name,age再利用快捷键生成,Alt+shift+s +c:空参 Alt+shift+s +o:有参 Alt+shift+s +r:set&get方法Ctrl+shift+ ...
- Docker部署SonarQube
依赖 CentOS 7.2+ docker 1.13+ docker-compose 1.20+ 将下面文件内容另存为docker-compose.yml文件,执行docker-compose up ...
- 20165223 实验三 敏捷开发与XP实践
目录 一.实验报告封面 二.具体实验内容 (一)敏捷开发与XP实践-1 代码规范格式化 (二)敏捷开发与XP实践-2 添加搭档项目 (三)敏捷开发与XP实践-3 搭档代码重构 (四)敏捷开发与XP实践 ...