c++设计模式模块与系统

ops/2024/11/29 22:09:47/

c++ 中lambda 本质就是一个匿名(没有名)的函数; 可以用一个数组元素存储一个函数的指针; 通过数组下标来使用函数;

高内聚低耦合

如何理解设计模式中的高内聚低耦合

  1. 高内聚: 用于指导如何组织和划分软件设计。

    **定义:**高内聚指的是在一个模块(如一个类或函数)中,所有的元素(如方法、属性等)都紧密地关联在一起,共同完成一个单一的任务或目标。简单来说,高内聚意味着模块内部的各个部分应该围绕一个单一的目标组织起来,而不是分散在多个不同的目标上。

重点强调是组合在一起完成一个功能。 这要求把控一个api足够单一完成某项功能的一部分。

当然有的api可以做成通用的,在不同功能内部使用。 这违反单一职责原则。 但同时只要他功能足够单一同时分布在不同功能中,也不违反高内聚。 重点强调功能单一。 它告诉功能类似的api 最好分开写多个api满足特定需求,而不要尝试一个api满足不同相似功能的需求。

2.低耦合 就很好理解。 功能与功能直接不要强相关, 即修改一个地方别的地方都要多很多修改。 修改一个功能影响很多其他功能, 影响的越多耦合性越大,反之越小。

可读性与可扩展性

代码的命名规则:

(变量)(函数)(类) (结构体)()命名 展示了代码的可读性。 让人一眼就能看懂的命名。

1.匿名函数

std::vector<std::function<int32_t()>> pos_func ={[&lineup]() ->int32_t { return lineup->GetPos1Hero(); } ,[&lineup]() ->int32_t { return lineup->GetPos2Hero(); } ,[&lineup]() ->int32_t { return lineup->GetPos3Hero(); } ,[&lineup]() ->int32_t { return lineup->GetPos4Hero(); } ,[&lineup]() ->int32_t { return lineup->GetPos5Hero(); } ,[&lineup]() ->int32_t { return lineup->GetPos6Hero(); } ,};int32_t source_hero = pos_func[request.pos - 1]();

2.模版类

template<typename ...Args>
class dispatcher;
template<typename Tag, typename Ret, typename ...Args>
class dispatcher<Tag, Ret(Args...)>
{
};static dispatcher<CopyType, std::unique_ptr<LogicCopy>(user_data_ptr, const copy_elem*, const copy_para_t&, const PackFightResultPara&)>g_copy_dispatcher;

3.工厂方法

// 抽象基类// 工厂1
// 工厂2
// 工厂3
创建对象 采用模版类根据类型创建对象

4.C++ 功能的模块和系统的设计

4.1模块设计原则

模块(Module)通常指的是一组相关功能的集合,这些功能共同完成某个特定任务。模块应该是独立的,具有清晰的接口和职责。

设计原则
  • 单一职责原则(SRP):一个模块应该只有一个职责,这样它更容易理解和修改。
  • 封装:将实现细节隐藏在模块内部,只暴露必要的接口。
  • 高内聚低耦合:模块内部的功能应该高度相关(高内聚),而模块之间的依赖关系应该尽量减少(低耦合)。

4.2系统设计原则

系统是多个模块的组合

设计原则
  • 分层设计:将系统划分为不同的层次(如数据访问层、业务逻辑层、表示层等),每个层次有明确的职责。
  • 依赖注入:通过依赖注入(Dependency Injection)来管理模块之间的关系,避免硬编码依赖。
  • 事件驱动设计:使用事件和消息传递来解耦模块之间的直接依赖。
实现方法
  • 工厂模式:使用工厂模式来创建和管理模块的实例。
  • 依赖注入容器:使用依赖注入容器来管理模块之间的依赖关系。
  • 事件系统:使用事件系统来解耦模块之间的直接调用。

设计上的平衡

设计一个系统

工厂基类,工厂类1,工厂类2,工厂类3

模版类: <类型,工厂对象指针>

全局静态模版类实例:


http://www.ppmy.cn/ops/137756.html

相关文章

使用Hugo和GitHub Pages创建静态网站个人博客

不需要服务器&#xff0c;不需要域名&#xff0c;不需要数据库&#xff0c;可以选择模版&#xff0c;内容为Markdown格式。 Hugo&#xff1a;https://gohugo.io 文档&#xff1a;https://gohugo.io/getting-started/quick-start/ 中文文档&#xff1a;https://www.gohugo.or…

云计算基础-期末复习

第一章&#xff1a;云计算概论 一、云计算的定义与特征 1. 定义&#xff1a; 云计算是一种通过网络以按需、可扩展的方式获取计算资源和服务的模式。它将计算资源视为一种公用事业&#xff0c;用户可以根据需求动态获取和释放资源&#xff0c;而无需了解底层基础设施的细节。…

AIGC时代:如何快速搞定Spring Boot+Vue全栈开发

文章目录 一、Spring Boot基础二、Vue.js基础三、Spring Boot与Vue.js集成四、性能优化与最佳实践《快速搞定Spring BootVue全栈开发》内容简介作者简介目录前言/序言本书内容本书特点读者对象 随着人工智能生成内容&#xff08;AIGC&#xff09;技术的迅速发展&#xff0c;内容…

200. 岛屿数量【 力扣(LeetCode) 】

文章目录 零、LeetCode 原题一、题目描述二、测试用例三、解题思路四、参考代码 零、LeetCode 原题 200. 岛屿数量 一、题目描述 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 …

ajax基础

一&#xff1a;express框架 在终端输入nodejs文件名 // 引入express const express require(express); //创建应用对象 const app express(); //创建路由规则 app.get(/,(request,response) > {//设置响应response.send(Hello Express); }); // 监听3000端口 app.lis…

新潮传媒集团创始人张继学将出席创客匠人创始人IP领袖高峰论坛

正式官宣&#xff01;中国最大的社区数字化媒体平台——新潮传媒集团创始人张继学&#xff0c;已确认受邀出席创客匠人5000人“全球创始人IP领袖高峰论坛”&#xff0c;与我们共赴一场知识服务行业的盛宴&#xff01; 由创客匠人发起的“全球创始人IP领袖高峰论坛”将在2024年…

非协议默认端口的:NAT alg需配置port-mapping

参考解释文章&#xff1a; https://zhiliao.h3c.com/Theme/details/167990 https://zhiliao.h3c.com/Theme/details/44359 nat的alg和port-mapping - 知了社区 NAT alg的功能 NAT ALG&#xff08;Application Level Gateway&#xff0c;应用层网关&#xff09;主要完成对应用…

【11-20期】Java面试进阶:深入解析核心问题与实战案例

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 文章题目&#xff1a;Java面试进阶&#xff1a;深入解析11-20期核心问题与实战案例 摘要&#xff1a; 本篇…