前提:接口隔离模式

在组建构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接接口(稳定的),来隔离本来相互紧密关联的接口是一种常见的解决方案。

典型模式:

门面模式:Façade,
代理模式:Proxy,
适配器模式:Adapter,
中介者模式:Mediator

一:门面模式(外观模式)

推文:外观模式 Facade Pattern

(一)概念

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() = 0;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;
}

转载于:https://www.cnblogs.com/ssyfj/p/9540458.html

设计模式---接口隔离模式之门面模式(Façade)相关推荐

  1. php设计之初用于什么,PHP设计模式(七)之门面模式

    一.什么是外观模式(Facade Pattern) 定义:外观模式又称门面模式,提供一个统一的接口,用来访问子系统中的一群接口. 外部与子系统之间的通信采用门面(Facade)对象来完成. [举例]比 ...

  2. Java设计模式之外观模式(门面模式,迪米特法则的具体实现,抽象外观类改进)

    一.概述 引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口.简而言之,外观模式就是定义了一个高层接口,这个接口可以使得这一子系统更加容易使用. 如果没有这个外观类, ...

  3. 七、享元模式与门面模式详解

    10.享元模式 10.1.课程目标 1.掌握享元模式和组合模式的应用场景. 2.了解享元模式的内部状态和外部状态. 3.掌握组合模式的透明写法和安全写法. 4.享元模式和组合模式的的优缺点. 10.2 ...

  4. Facade模式(门面模式)

    模式简介 门面模式用于客户端与内部系统的解耦,客户端对内部系统的调用封装在门面类中,让客户端通过门面类调用功能,从而简化了客户端对内部系统的调用. 模式UML图 代码示例(C#) 提示:可在本栏目的资 ...

  5. 门面模式php,门面模式 php

    门面模式 php //门面模式 (Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面.门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,用户只需要直接与 ...

  6. 设计模式 接口隔离原则

    设计模式 接口隔离原则 用类图说明 然后书写代码清单 public interface IPettyGirl{// 面孔public void goodLooking();// 身材public vo ...

  7. 颜值10分姐姐带我玩转java设计模式(内附照片)- 门面模式

    先不说话,直接来张姐姐照片,称呼包子姐姐即可,希望包子姐姐能带飞. 原创不易,麻烦先三连,再细看,谢谢 示例的源码可以直接通过csdn下载也可以通过git导出:https://github.com/i ...

  8. 组合模式 桥接模式 java_java设计模式5.组合模式、门面模式、享元模式、桥接模式...

    组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...

  9. Head First 设计模式 —— 装饰器模式与门面模式

    0. 特点与特性 装饰模式指的是在不必改变原类文件(而是创建外部的包装对象)和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 1. 装饰器模式与继承 ...

最新文章

  1. 用TextKit实现表情混排
  2. boost::gregorian模块实现localization的测试程序
  3. C++:两个数组求最值、排序、合并
  4. asp.net listview 字段太多 滚动条_人生有太多身不由己,回头看看最对不起的就是自己...
  5. bash编程(一)之运算及比较
  6. 美国Hack the Army 3.0 漏洞奖励计划启动
  7. Magic Battery for Mac(电量显示工具)
  8. Mac新系统macOS Big Sur支持哪些Mac机型
  9. 新时代的web与app开发
  10. 传智播客毕向东java基础全套视频教程_传智播客毕向东JAVA基础教程全套视频教程(324课)...
  11. cas4.x 单点登录开发入门
  12. Aspenone.hysys.V7.1多国语言包(含中文)
  13. python判断空行_python判断空行
  14. 怎样在计算机上登录qq音乐,如何使用手机控制电脑qq音乐播放
  15. MATLAB 实现电子版的手写签名
  16. 阿里巴巴Java面试题目
  17. 7-2 符号配对 (20 分) c语言版
  18. 永中word页码怎么从第二页开始_永中PDF产品升级!Now注册即享VIP~
  19. MongoDB误操作恢复测试
  20. 数值型数据的表示(1.0)

热门文章

  1. .NET代码编写规范 整理
  2. Impala架构和工作原理
  3. 实验1 开发环境的熟悉
  4. MyBatis-Oracle-selectKey返回主键
  5. 安防市场规模超万亿 罗曼股份推智慧联动安防
  6. 嵌入式工程师该如何选择合适的开发系统
  7. Windows sever 2008 动态硬盘数据恢复
  8. IOS正则表达式的用法简介
  9. [转]使用Yii CUploadedFile上传文件(图片)
  10. yum升级rhel5