C++ 设计原则 - 开放封闭原则

C++ 中的开放封闭原则(Open-Closed Principle,OCP)是SOLID设计原则的一部分,它指出软件实体(类、模块、函数等)应该对扩展是开放的,对修改是封闭的。换句话说,当需要改变系统的行为时,不应该修改现有的代码,而是通过扩展来实现变化。

通过一个简单的示例来说明如何在 C++ 中实现开放封闭原则。假设我们有一个图形绘制程序,需要支持不同类型的图形(如圆形、矩形)并且能够根据需要添加新的图形类型,但不希望修改现有的代码。

#include <iostream>
#include <vector>

// 图形基类
class Shape 
{
public:
    virtual void draw() const = 0;
    virtual ~Shape() 
    {
    }
};

// 圆形类
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;
    }
};

// 图形绘制
class Draw
{
public:
    void drawShapes(const std::vector<Shape*>& shapes) 
    {
        for (const auto& shape : shapes) 
        {
            shape->draw();
        }
    }
};

int main() 
{
    Circle circle;
    Rectangle rectangle;

    Draw drawer;
    std::vector<Shape*> shapes = {&circle, &rectangle};
    drawer.drawShapes(shapes);

    return 0;
}

我们定义了一个图形基类 Shape,并且派生出了两种具体的图形类:Circle 和 Rectangle。然后我们通过图形绘制程序 Draw 来绘制不同类型的图形。

当需要在上述示例中添加新的图形类型时,比如三角形,我们可以遵循开放封闭原则进行扩展而不修改现有代码。

// 新的三角形类
class Triangle : public Shape 
{
public:
    void draw() const override 
    {
        std::cout << "drawing a triangle" << std::endl;
    }
};

int main() 
{
    Circle circle;
    Rectangle rectangle;
    Triangle triangle; // 添加了新的三角形类

    Draw drawer;
    std::vector<Shape*> shapes = {&circle, &rectangle, &triangle}; // 将新的三角形对象加入绘制程序中
    drawer.drawShapes(shapes);

    return 0;
}

示例中,我们创建了一个新的三角形类 Triangle,并且让它继承自 Shape 类。然后在主函数中,我们创建了一个三角形对象并将其加入到绘制程序中,而不需要修改原有的 Shape、Circle、Rectangle 或 Draw 。这样就实现了对程序的扩展而不需要修改已有的代码,符合开放封闭原则。

通过这种方式,我们可以持续地向系统中添加新的图形类型,而不会影响到已有的代码,从而体现了系统的可扩展性和灵活性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值