c++设计模式八股文
·
高内聚低耦合
https://cloud.tencent.com/developer/article/2459067
耦合和内聚虽然是两个不同的概念,但它们是相互影响的。耦合关注模块之间的依赖性,而内聚关注模块内部的关联度。通常,我们希望模块设计遵循“高内聚、低耦合”的原则,以提升系统的可维护性和扩展性。
常见的内聚类型:
功能内聚:模块的所有部分都围绕一个功能。
顺序内聚:模块中的任务按顺序执行。
通信内聚:模块中的任务使用相同的数据。
时间内聚:模块中的任务在同一时间执行。
偶然内聚:模块的任务彼此之间几乎没有关联。
常见的耦合类型:
内容耦合:一个模块直接修改另一个模块的数据。
公共耦合:多个模块共享同一个全局数据。
控制耦合:一个模块通过传递控制信息影响另一个模块的行为。
数据耦合:模块之间通过参数传递数据,但不包含控制信息。
设计模式七大原则
- 单一职责原则 – Single Responsibility Principle
一个类(方法)只负责一个功能,避免职责过多导致代码混乱
循单一职责原的优点有:
1.可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
2. 提高类的可读性,提高系统的可维护性;
3.变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
- 接口隔离原则 – Interface Segregation Principle
使用多个专门的接口比使用单一的总接口要好。
接口隔离原则和单一职责都是为了提高类的内聚性、降低它们之间的耦合性,体现了封装的思想,但两者是不同的:
(1)单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
(2)单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。
- 迪米特法则(最少知道原则) – Demeter Principle
最少知道原则,一个对象应只与必要的对象交互,减少依赖
从迪米特法则的定义和特点可知,它强调以下两点:
从依赖者的角度来说,只依赖应该依赖的对象。
从被依赖者的角度说,只暴露应该暴露的方法。
- 开放封闭原则(Open-Closed Principle, OCP)
对拓展开放,对修改关闭。程序需要拓展的时候不能修改原有代码,实现热插拔。
开闭原则的关键:面向抽象编程,可以为系统定义一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成。 - 里氏替换原则 – Liskov Substitution Principle
参考:https://cloud.tencent.com/developer/article/2250528
任何基类可以出现的地方,子类一定可以出现。
重载 ( 输入参数 宽松 ) : 子类的方法 重载 父类的方法 时 , 方法的前置条件 ( 输入参数 ) , 要比 父类方法的输入参数更宽松 ;如 : 父类的参数是 HashMap , 如果要符合 里氏替换原则 , 子类如果重载父类方法 , 那么需要使用 Map 类型参数 ;
重写 ( 返回值 严格 ) : 当 子类的方法 重写 / 重载 / 实现 父类的方法时 , 方法的 后置条件 ( 返回值 ) 要 比父类更严格或相等 ;如 : 父类的返回值是 Map , 子类的相同的方法 是 Map 或 HashMap ; - 依赖倒置原则
面向接口编程,依赖于抽象类或者接口,而不是具体实现类。
使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。在运行时再传入具体类型的对象,由子类对象来覆盖父类对象
在实现依赖倒转原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入(DependencyInjection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入
开闭原则、里氏代换原则和依赖倒转原则,在大多数情况下,这三个设计原则会同时出现,开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段,它们相辅相成,相互补充,目标一致,只是分析问题时所站角度不同而已。
- 组合复用原则(Composite Reuse Principle, CRP)
优先使用对象组合而不是类继承,提升代码的灵活性和复用性
总结
单一职责原则告诉我们实现类要职责单一
接口隔离原则告诉我们在设计接口的时候要精简单一
迪米特原则告诉我们要降低耦合
开闭原则是总纲,告诉我们要对扩展开放,对修改关闭
里氏替换原则告诉我们不要破坏继承体系
依赖倒置原则告诉我们要面向接口编程
设计模式分类
- 创建型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern) - 结构型模式
这些模式关注对象之间的组合和关系,旨在解决如何构建灵活且可复用的类和对象结构。
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern) - 行为型模式
这些模式关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装。
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
更多推荐

所有评论(0)