SOLID原则学习,开闭原则

文章目录

  • [1. 定义](#1. 定义)
  • [2. 开闭原则的详细解释](#2. 开闭原则的详细解释)
  • [3. 实现开闭原则的方法](#3. 实现开闭原则的方法)
  • [4. 总结](#4. 总结)

1. 定义

开闭原则(Open-Closed Principle,OCP)是面向对象设计中的五大原则(SOLID)之一,由Bertrand Meyer提出。开闭原则的核心思想是:

软件实体(类、模块、函数等)应该对扩展开放,但对修改关闭。

这意味着,当需求发生变化时,应该通过添加新的代码来扩展系统的行为,而不是修改已有的代码。这样可以减少对现有代码的影响,降低引入新错误的风险,并提高代码的可维护性和可复用性。


2. 开闭原则的详细解释

1. 对扩展开放:当系统需要增加新的功能时,应该允许通过添加新的代码来实现,而不是修改现有的代码。

2. 对修改关闭:一旦一个模块或类已经完成并通过测试,就不应该再修改它的源代码,除非是为了修复bug。


3. 实现开闭原则的方法

为了实现开闭原则,通常会使用以下设计模式或技术:

  • 抽象与多态:通过定义抽象类或接口,允许子类或实现类扩展行为。

  • 策略模式:将算法或行为封装在独立的类中,使得它们可以相互替换。

  • 模板方法模式:定义一个算法的骨架,允许子类在不改变算法结构的情况下重新定义算法的某些步骤。

  • 装饰器模式:动态地为对象添加新的行为,而不改变其原有结构。

实例分析

假设我们有一个简单的图形绘制系统,系统需要支持绘制不同类型的图形(如圆形、矩形等)。最初,系统只支持绘制圆形,但随着需求的变化,我们需要支持绘制矩形。

不符合开闭原则的实现

cpp 复制代码
class Graphic {
public:
    void drawCircle() {
        // 绘制圆形的代码
    }

    void drawRectangle() {
        // 绘制矩形的代码
    }
};

void drawAllShapes(Graphic& graphic) {
    graphic.drawCircle();
    graphic.drawRectangle();
}

在这个实现中,每当需要增加一个新的图形类型时,我们都需要修改Graphic类,添加新的绘制方法。这违反了开闭原则,因为我们需要修改已有的代码来扩展功能。

符合开闭原则的实现

为了符合开闭原则,我们可以使用抽象和多态来设计系统。

cpp 复制代码
#include <iostream>
#include <vector>

// 抽象基类
class Shape {
public:
    virtual void draw() const = 0;
    virtual ~Shape() = default;
};

// 圆形类
class Circle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

// 矩形类
class Rectangle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a rectangle." << std::endl;
    }
};

// 绘制所有图形
void drawAllShapes(const std::vector<Shape*>& shapes) {
    for (const auto& shape : shapes) {
        shape->draw();
    }
}

int main() {
    std::vector<Shape*> shapes;
    shapes.push_back(new Circle());
    shapes.push_back(new Rectangle());

    drawAllShapes(shapes);

    // 清理内存
    for (const auto& shape : shapes) {
        delete shape;
    }

    return 0;
}

在这个实现中,我们定义了一个抽象的Shape类,并让Circle和Rectangle继承自Shape。当需要增加新的图形类型时,我们只需要创建一个新的类并实现draw方法,而不需要修改现有的代码。这样,系统对扩展是开放的,对修改是关闭的。


4. 总结

开闭原则是面向对象设计中的重要原则,它鼓励我们通过扩展而不是修改来增加系统的功能。通过使用抽象和多态,我们可以设计出符合开闭原则的系统,从而提高代码的可维护性和可复用性。

相关推荐
攻城狮7号41 分钟前
【AI时代速通QT】第八节:Visual Studio与Qt-从项目迁移到多版本管理
c++·qt·跨平台·visual studio·qt vs tools
郝学胜-神的一滴41 分钟前
QAxios研发笔记(一):在Qt环境下,构建Promise风格的Get请求接口
开发语言·c++·spring boot·qt·ajax·前端框架·软件工程
AA陈超1 小时前
虚幻引擎UE5专用服务器游戏开发-21 连招技能动画蒙太奇播放
c++·游戏·ue5·游戏引擎·虚幻
无敌最俊朗@6 小时前
C++ 序列容器深度解析:vector、deque 与 list
开发语言·数据结构·数据库·c++·qt·list
Humbunklung7 小时前
VC++ 使用OpenSSL创建RSA密钥PEM文件
开发语言·c++·openssl
Humbunklung7 小时前
填坑:VC++ 采用OpenSSL 3.0接口方式生成RSA密钥
开发语言·c++·rsa·openssl 3.0
Larry_Yanan7 小时前
QML学习笔记(十五)QML的信号处理器(MouseArea)
c++·笔记·qt·学习·ui
努力学习的小廉8 小时前
我爱学算法之—— 模拟(下)
c++·算法
Larry_Yanan9 小时前
QML学习笔记(十七)QML的属性变更信号
javascript·c++·笔记·qt·学习·ui
hsjkdhs10 小时前
C++之拷贝构造(浅拷贝与深拷贝)、this指针、内联函数
c++