外观模式:深入解析与C++实践
最编程
2024-08-05 22:01:55
...
外观模式结构
- Facade 定义子系统的多个模块对外的高层接口,通常需要调用内部的多个模块,从而把客户的请求代理给适当的子系统。
- 模块 接受Facade对象的委派,真正实现功能,各个模块之间可能有交互。但请注意,Facade对象知道各个模块,但是各个模块不应该知道Facade对象。
外观模式实例代码
由于上面外观模式的结构过于抽象,因此把它具体点。假设系统内有三个模块,分别是AModule,BModule和CModule,它们分别有一个示意的方法,那么整体结构如下图所示。
代码实现
#include <iostream>
#include <memory>
/**
* A模块接口
*/
class AModuleApi {
public:
virtual void testA() = 0;
virtual ~AModuleApi() {}
};
/**
* A模块接口具体实现
*/
class AModuleImpl : public AModuleApi {
public:
void testA() override
{
std::cout << "operate method testA in AModule" << std::endl;
}
};
/**
* B模块接口
*/
class BModuleApi {
public:
virtual void testB() = 0;
virtual ~BModuleApi() {}
};
/**
* C模块接口具体实现
*/
class BModuleImpl : public BModuleApi {
public:
void testB() override
{
std::cout << "operate method testB in BModule" << std::endl;
}
};
/**
* C模块接口
*/
class CModuleApi {
public:
virtual void testC() = 0;
virtual ~CModuleApi() {}
};
/**
* C模块接口具体实现
*/
class CModuleImpl : public CModuleApi {
public:
void testC() override
{
std::cout << "operate method testC in CModule" << std::endl;
}
};
/**
* 外观对象
*/
class Facade {
public:
/**
* 示意方法,满足客户需求的功能
*/
static void test()
{
/**
* 在内部实现的时候,可能会调用到内部的多个模块
* 用智能指针new模块对象,其实可以用局部对象调用,
* 考虑到模块对象可能比较大,担心占用栈空间过大
*/
std::shared_ptr<AModuleApi> aptr(new AModuleImpl());
aptr->testA();
std::shared_ptr<BModuleApi> bptr(new BModuleImpl());
bptr->testB();
std::shared_ptr<CModuleApi> cptr(new CModuleImpl());
cptr->testC();
}
};
void test()
{
Facade::test();
}
int main(int argc, char** argv)
{
test();
return 0;
}
运行结果:
operate method testA in AModule
operate method testB in BModule
operate method testC in CModule
以上例子,Facade类其实相当于A,B,C模块的外观界面,Facade类也被称为A,B,C模块对外的接口,那么客户端就不需要知道系统内部的实现细节,甚至客户端都不需要知道A,B,C模块的存在,客户端跟Facade类交互就好了,从而更好实现了客户端和子系统中A,B,C模块的解耦,让客户端更容易地使用系统。
外观模式的目的
外观模式的目的不是给子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散解耦,从而让外部能够更简单地使用子系统。这点要特别注意,因为外观是当做子系统对外接口的实现,虽然也可以在这里定义一些子系统没有到额功能,但不建议这么做。外观应该是包装已有的功能,它主要负责组合已有功能来实现客户需要,而不是添加新的实现。
外观模式的好处
能够选择性地暴露接口的方法,尽量减少子系统接口功能的暴露。一个模块的接口中定义的方法可以分为两部分,一部分是给子系统外部使用的,一部分是子系统内部的模块间相互调用时使用的。有了Facade接口,那么用于子系统内部的接口功能就不用暴露给子系统的外部。
外观接口的本质
封装交互,简化调用
上一篇: 外观模式:让你的设计更加简洁易懂
下一篇: 外观模式:简化复杂系统的设计
推荐阅读
-
深入理解LVS管理工具ipvsadm:详细解析与NAT模式实操演示
-
外观模式:深入解析与C++实践
-
深入理解韩顺平设计模式:外观模式解析
-
代理人模式、外观模式与适配器模式:深入解析与比较
-
外观模式:C++设计模式解析(第八篇)
-
深入理解与实践:AT89C51单片机的中断系统及其应用实验解析
-
玩转C++:理解类与对象 - 这些关键知识点:对象模型、this指针的秘密、成员变量和成员函数独立存放、深入解析this指针、以及如何安全地使用空指针调用成员函数,还有const修饰的成员函数的作用
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾
-
深入理解分布式事务:JTA的核心机制与实践解析(第三部分)
-
滑动窗口基础算法系列002:深入解析与实践