外观模式(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。

相关推荐
geovindu2 天前
rust: Facade Pattern
开发语言·后端·设计模式·rust·外观模式
5G微创业3 天前
去水印API如何实现技术变现
python·sdk·短视频
weixin_461769407 天前
机械臂SDK运行日志
conda·sdk
艾莉丝努力练剑8 天前
【AI大模型接入SDK】ChatSDK 集成测试概述
jvm·c++·人工智能·学习·面试·集成测试·sdk
艾莉丝努力练剑8 天前
【AI大模型接入SDK】ChatSDK:CMake构建静态库完整实现
java·开发语言·网络·c++·人工智能·学习·sdk
less_121389 天前
HarmonyOS WPS Open SDK 二开实践:统一接口如何收敛多套打开链路
sdk·harmonyos·wps·鸿蒙开发
ShineWinsu18 天前
对于Coze—AI:SDK的解析
人工智能·python·ai·sdk·项目·coze·字节跳动
SoStraw22 天前
从零接入 webrpc:按这份最小清单跑通双端,再写业务
sdk·p2p·入门·token·webrpc·opensession·senddata
Java后端的Ai之路1 个月前
20、Python - 备忘录模式
开发语言·人工智能·python·外观模式·备忘录模式
Java后端的Ai之路1 个月前
21、Python - 命令模式
开发语言·人工智能·python·命令模式·外观模式