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

相关推荐
wWYy.3 天前
什么是SDK?
sdk
我登哥MVP4 天前
走进 Gang of Four 设计模式:外观模式
java·设计模式·外观模式
ttod_qzstudio8 天前
【软考设计模式】外观模式:复杂子系统的“门面“封装与代码填空精讲
设计模式·外观模式
老码观察1 个月前
设计模式实战解读(十一):外观模式——给复杂系统套一层壳
python·设计模式·外观模式
咖啡八杯1 个月前
GoF设计模式——外观模式
java·设计模式·外观模式
likerhood2 个月前
设计模式 · 外观模式(Facade Pattern)
设计模式·外观模式
c++之路2 个月前
外观模式(Facade Pattern)
算法·外观模式
蜡笔小马2 个月前
09.C++设计模式-外观模式
c++·设计模式·外观模式
多加点辣也没关系2 个月前
设计模式-外观模式
设计模式·外观模式