外观模式(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 天前
鸿蒙 WPS Open SDK 二开复盘:从注册、打开到回传的完整能力链
服务器·sdk·harmonyos·wps·鸿蒙开发
承渊政道5 天前
启元Q1机器人SDK实操:跑通触摸消息,用ROS 2图形界面完成调试与模型展示
机器人·sdk·具身智能·应用开发·ros 2·启元q1
体验家6 天前
智能家居SDK反馈收集:体验家如何打通App与设备使用体验
智能家居·sdk·客户反馈
鸽芷咕7 天前
从环境搭建到敬礼动作:启元 Q1 SDK 全流程实战与 8 个实测坑排查手册
数据库·ai·机器人·sdk·启元q1
摘星编程7 天前
启元 T1 机器人 SDK 探秘:安装配置、六种变形动作与双机型共存实测
sdk·教程·四足机器人·atomgit·启元
Rockbrook9 天前
户外装备品牌实力企业
外观模式
艾莉丝努力练剑9 天前
【AI大模型接入SDK】ChatServer接口实现
c++·人工智能·学习·ai·架构·大模型·sdk
体验家12 天前
新能源汽车SDK嵌入式反馈收集:体验家XMPlus如何在关键触点获取反馈
汽车·sdk·客户体验管理·客户反馈
体验家18 天前
口腔医疗 SDK 嵌入式反馈收集:体验家 XMPlus 如何在预约与就诊触点获取反馈
sdk·客户体验管理·b2b企业服务·口腔医疗
中杯可乐多加冰19 天前
从 SDK 到桌面应用:我用科沃斯八界把视觉、导航和机械臂接起来
人工智能·机器人·sdk·具身智能·科沃斯·八界创造者计划·科沃斯八界