设计模式---接口隔离模式之门面模式(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对象起到控制器的作用 二:动机 在软件构建的过程中, ...
 
随机推荐
- python之旅六【第六篇】模块
			
json和pickle 用于序列化的两个模块json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进行转换 json模块提供了四 ...
 - webpack——阮一峰webpackDemo分析
			
首先上交阮一峰老师的github地址,一共有15个demo,我们一个一个的进行分析,结合上文所学的知识! 其中有一些内容,我做了修改,我是先看一遍然后从新敲了一遍. https://github.co ...
 - vim复制粘帖代码
			
参照:https://blog.csdn.net/sodawaterer/article/details/61918370
 - 【XSY1529】小Q与进位制 分治 FFT
			
题目大意  小Q发明了一种进位制,每一位的变化范围是\(0\)~\(b_i-1\),给你一个这种进位制下的整数\(a\),问你有多少非负整数小于\(a\).结果以十进制表示.  \(n\leq 1 ...
 - 卢卡斯定理&扩展卢卡斯定理
			
卢卡斯定理 求\(C_m^n~mod~p\) 设\(m={a_0}^{p_0}+{a_1}^{p_1}+\cdots+{a_k}^{p_k},n={b_0}^{p_0}+{b_1}^{p_1}+\cd ...
 - mysql中存储字段类型的查询效率
			
检索性能从快到慢的是(此处是听人说的): 第一:tinyint,smallint,mediumint,int,bigint第二:char,varchar第三:NULL 解释(转载): 整数类型1.TI ...
 - Django  media 配置
			
Django media 配置 settings.py 配置 配置 media 的路径, 以及连接到主路径 还要添加一个 上下文管理 TEMPLATES = [ { 'BACKEND': 'dja ...
 - 百度APP爬虫
			
1.抓包 访问一个频道,Charles抓包,找到真实连接,一般返回json数据和网页中数据对应为真实连接 请求方式为post,所以要添加请求头和表单数据,由于在charles环境下,所以要添加char ...
 - 《Hands-On Machine Learning with Scikit-Learn&TensorFlow》mnist数据集错误及解决方案
			
最近在看这本书看到Chapter 3.Classification,是关于mnist数据集的分类,里面有个代码是 from sklearn.datasets import fetch_mldata m ...
 - python3 字典dict
			
字典是用大括号{}表示 dict() 键必须是唯一的,但值则不必:键是不可变的,如字符串.数字.元组,值可以取任意数据类型: 可以迭代, del可以删除一对键值,del Dict['key'] 重复给 ...