外观模式(Facade Pattern)

外观模式(Facade Pattern) 是 GoF(四人帮)23 种设计模式之一,属于结构型设计模式

它的核心思想只有一句话:

把复杂系统封装起来,对外提供一个统一、简单的接口,让使用者不需要了解内部复杂的实现。

一、为什么需要外观模式?

假设没有 Robot 类,用户想控制机器人。

他必须自己创建很多对象

cpp 复制代码
EventCenter events;

Connection connection(events, options.connection);

Navigator navigator(std::make_shared<Connection>(connection));

Motion motion(std::make_shared<Connection>(connection));

Battery battery(std::make_shared<Connection>(connection));

Voice voice(std::make_shared<Connection>(connection));

Device device(std::make_shared<Connection>(connection));

然后:

cpp 复制代码
connection.connect();

motion.move(...);

navigator.navigateTo(...);

battery.getState();

voice.speak(...);

你会发现:

用户必须知道:

Connection 怎么创建

EventCenter 怎么创建

Motion 怎么依赖 Connection

Navigator 怎么依赖 Connection

Battery 怎么依赖 Connection

SDK 的所有内部细节都暴露给用户了。

对于 SDK 使用者来说,非常复杂。

于是,我们增加一个:

cpp 复制代码
Robot

用户变成:

cpp 复制代码
auto robot = Robot::createConnected(options);

robot->motion().move(...);

robot->navigator().navigateTo(...);

robot->battery().getState();

robot->voice().speak(...);

是不是一下子简单了?

这就是外观模式

二、Robot 为什么是外观模式?

看看 Robot 里面都有什么:

cpp 复制代码
class Robot
{
private:

    Connection connection_;

    Motion motion_;

    Navigator navigator_;

    Battery battery_;

    Voice voice_;

    Device device_;

    EventCenter events_;
};

Robot 内部拥有:

cpp 复制代码
Connection

Motion

Navigator

Battery

Voice

Device

EventCenter

但是:

用户根本不知道这些对象怎么创建。

用户只看到:

cpp 复制代码
robot->motion()

robot->navigator()

robot->battery()

robot->voice()

robot->device()

Robot 把所有复杂对象全部藏起来了。

这就是:

对外提供统一入口。

三、外观模式的优缺点

优点

① 使用简单

用户只需要:

cpp 复制代码
Robot robot;

不需要:

了解:

几十个类。

② 降低耦合

用户:

不知道:

Connection。

以后:

Connection:

换成:

WebSocket。

用户:

代码:

不用:

修改。

③ 隐藏实现

以后:

SDK:

增加:

Camera

Lidar

Map

Task

Robot:

里面:

增加:

成员。

用户:

代码:

不用:

变。

缺点

如果:

Robot:

越来越大。

可能:

变成:

Robot

管理100多个模块

就会:

越来越臃肿。

所以:

Robot:

一般:

只负责:

协调。

真正:

业务:

放:

Motion、

Battery、

Navigator。

相关推荐
less_121382 天前
HarmonyOS WPS Open SDK:旧 HAR 迁移到统一接口联调指南
华为·sdk·harmonyos·wps·鸿蒙开发·文档编辑
艾莉丝努力练剑5 天前
【AI大模型接入SDK】项目的数据结构设计
数据结构·人工智能·大模型·sdk·文件系统·岗位
艾莉丝努力练剑7 天前
【AI接入大模型SDK】ChatSDK示例验证
人工智能·学习·面试·大模型·sdk
美狐美颜SDK开放平台14 天前
第三方美颜SDK接入教程:直播APP实现实时美颜、滤镜与美型效果的方法
人工智能·深度学习·音视频·sdk·美颜sdk·视频美颜sdk·直播app开发
AmyLin_200117 天前
PDF 脱敏技术【1】:PDF 脱敏不是盖黑框:为什么敏感信息仍能被复制,正确的保护方式是什么?
安全·pdf·sdk·脱敏·文档安全·pdf 脱敏·智能脱敏
AmyLin_200120 天前
PDF 色彩保真工程实践【6】怎么证明“真的无损“?——SHA-256 校验与三个真实踩坑
c++·pdf·内存·sdk·调试·印刷
AmyLin_200122 天前
PDF 色彩保真工程实践【5】核心实现(下):拼装 Image XObject、页面资源与内容流
c++·pdf·sdk·颜色空间·印刷·icc·cmyk
5G微创业1 个月前
Python / Node.js 调用短视频去水印 API 完整示例(含 SDK)
python·node.js·音视频·api·sdk·短视频
geovindu1 个月前
java: Facade Pattern
java·开发语言·后端·外观模式·结构型模式
Dlrb12111 个月前
ARM--IMX6ULL的SDK学习,BSP开发工程管理,以及链接脚本与Makefile的编写
单片机·嵌入式硬件·arm·sdk·链接脚本·i.mx6ull·cortex-a7