外观模式

  • 一、概述
  • 1.结构
    • 2.适用场景
      • 3.优缺点
        • 4.区别
    • 二、实例

一、概述

外观模式是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

1.结构

  1. 外观(Facade)角色:为多个子系统对外提供一个共同的接口。

  2. 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。

  3. 客户(Client)角色:通过一个外观角色访问各个子系统的功能。

2.适用场景

  1. 为一个复杂的模块或子系统提供一个外界访问的接口。

  2. 子系统相对独立,外界对子系统的访问只要黑箱操作即可。

  3. 预防低水平人员带来的风险扩散。

3.优缺点

优点:

  1. 降低了子系统与客户端之间的耦合,减少了系统的相互依赖,使得子系统的变化不会影响调用它的客户类。。
  2. 提高了灵活性。不管系统内部如何变化,只要不影响到外观对象,任你自由活动。
  3. 提高了安全性。想让你访问子系统的哪些业务就开通哪些逻辑,不在外观上开通的方法,你就访问不到。

缺点:

  1. 增加新的子系统可能需要修改外观类或客户端的源码,违背了开闭原则。

4.区别

  1. 外观模式和单例模式:通常可以把外观对象设计成单例模式。

  2. 外观模式和抽象工厂模式:外观类可以通过抽象工厂获取子系统的实例,子系统可以从内部对外观类进行屏蔽。

  3. 外观模式和中介模式:外观模式关注的是外界与子系统间的交互,而中介者模式关注的是子系统内部间的交互。

二、实例

#include<iostream>
#include<memory>
using namespace std;/*
* 关键代码:客户与系统之间加一个外观层,外观层处理系统的调用关系、依赖关系等。
*以下实例以电脑的启动过程为例,客户端只关心电脑开机的、关机的过程,并不需要了解电脑内部子系统的启动过程。
*///抽象控件类,提供接口
class Control {public:virtual ~Control() = default;//建议将基类的析构函数定义为虚函数virtual void start() = 0;virtual void shutdown() = 0;
};//子控件, 主机
class Host : public Control {public:void start() override {cout << "Host start" <<endl;}void shutdown() override {cout << "Host shutdown" <<endl;}
};//子控件, 显示屏
class LCDDisplay : public Control {public:void start() override {cout << "LCD Display start" << endl;;}void shutdown() override {cout << "LCD Display shutdonw" << endl;;}
};//子控件, 外部设备
class Peripheral : public Control {public:void start() override {cout << "Peripheral start" << endl;;}void shutdown() override {cout << "Peripheral shutdown" << endl;;}
};class Computer {private://私有,屏蔽子系统Host m_host;LCDDisplay m_display;shared_ptr<Peripheral>m_pPeripheral=make_shared<Peripheral>();public:void start() {m_host.start();m_display.start();m_pPeripheral->start();cout << "Computer start" << std::endl;}void shutdown() {m_host.shutdown();m_display.shutdown();m_pPeripheral->shutdown();cout << "Computer shutdown" << endl;}};int main() {Computer computer;computer.start();cout << "=====Client do something else !====" << endl;computer.shutdown();return 0;}

Facade(外观模式) 结构型相关推荐

  1. 设计模式笔记 10.Facade 外观模式(结构型模式)

    10. Facade 外观模式      2008-8-18 动机(Motivation) 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种 ...

  2. GOF设计模式之外观模式(结构型代理模式)

  3. 设计模式10: Facade 外观模式(结构型模式)

    Facade 外观模式(结构型模式) 系统的复杂度 假设我们要开发一个坦克模式系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎.控制器.车轮.车身等各个子系统构成. internal cl ...

  4. Facade外观模式

    Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战.在这里我想举一个例子: ...

  5. 享元模式 - 结构型模式

    模式类型:     Flyweight   享元模式 - 结构型模式 意图:     The intent of this pattern is to use sharing to support a ...

  6. 设计模式学习之---Facade(外观)模式

    1.Facade外观模式,是一种接口型模式.这种模式的目的在于,它为子系统中的一组接口,定义了一个更高层次的接口,通过这个接口,提供一个统一的接口,使子系统更加容易使用. 2.实现:创建一个新的类,提 ...

  7. php5.1 facade,php设计模式 Facade(外观模式)

    模式定义:外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加 ...

  8. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

  9. 组合模式(部分整体模式)—结构型

    创建型 1,单例设计模式 2,工厂设计模式 3,建造者设计模式 4,原型设计模式 结构型 5,代理设计模式 6,桥接设计模式 7,装饰设计模式 8,适配器设计模式 9,外观设计模式 10,享元设计模式 ...

最新文章

  1. 另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...
  2. js数组、字符串常用方法和互相转换,==和===
  3. python 为什么用%格式化_Python中应该使用%还是format来格式化字符串?
  4. matlab中龙贝格积分,龙贝格积分-matlab通用程序
  5. 深入解析thinkphp中的addAll方法
  6. 有了报表FineReport,为什么还要上FineBI?
  7. mac下idea中使用svn出现的问题的记录
  8. 使用Idea部署SSM项目后,访问路径为url:8080/项目名_war_exploded的解决方案
  9. 怎样对计算机窗口进行截图,Windows10:如何对计算机屏幕上的内容进行屏幕截图...
  10. 【图像压缩】基于matlab GUI DCT图像压缩【含Matlab源码 842期】
  11. linux unzip命令
  12. (前端发邮件)vue中使用smtp.js发送邮件
  13. 自定义View实现雨点洒落效果
  14. 阿里云服务器迁移注意事项等问题
  15. linux使用Quota配额之须配额目录为非独立文件系统并无可分配分区解决办法
  16. Excel如何打开两个独立窗口
  17. 【Spark深入学习 -10】基于spark构建企业级流处理系统
  18. EE4408: Machine Learning:
  19. Winodows subsystem for Linux(WSL)的安装及GUI图形界面启用
  20. 高通骁龙SDM450平台功能介绍

热门文章

  1. 从零开始搭建springboot框架
  2. Eclipse下用JFS和Tomcat防问SQLServer数据库的以下配置
  3. Kryo的基本简单使用
  4. 单继承与多继承的虚函数表
  5. Linux系统之Xinetd服务
  6. 夏天吃西瓜10大禁忌必须知道
  7. OSChina 周三乱弹 —— 生活终于对我这只小猫咪动手啦
  8. usermod--修改用户账号信息命令
  9. vmstat 命令参数详解
  10. 【笔记】 欧几里得(扩展欧几里得)