c++设计模式模块与系统
c++ 中lambda 本质就是一个匿名(没有名)的函数; 可以用一个数组元素存储一个函数的指针; 通过数组下标来使用函数;
高内聚低耦合
如何理解设计模式中的高内聚低耦合
-
高内聚: 用于指导如何组织和划分软件设计。
**定义:**高内聚指的是在一个模块(如一个类或函数)中,所有的元素(如方法、属性等)都紧密地关联在一起,共同完成一个单一的任务或目标。简单来说,高内聚意味着模块内部的各个部分应该围绕一个单一的目标组织起来,而不是分散在多个不同的目标上。
重点强调是组合在一起完成一个功能。 这要求把控一个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
模版类: <类型,工厂对象指针>
全局静态模版类实例: