首页 > 编程笔记 > C++笔记 阅读:10

开闭原则(C++实现,附带实例)

开闭原则是 SOLID 设计原则中的第二个原则,其核心思想是“软件实体应该对扩展开放,对修改关闭”。这意味着一个系统的设计和实现应该使得它可以在不修改现有代码的情况下进行扩展。

开闭原则强调了设计的灵活性和可维护性,是构建大型复杂系统的关键方面。

开闭原则鼓励我们通过抽象来设计组件,使得组件的行为可以通过新增派生类来扩展,而不是通过修改现有的代码。这种方法帮助开发者在不触碰原有代码的前提下,添加新功能或改变程序的行为。

遵循这一原则可以显著减少系统在升级和维护过程中引入错误的风险。

开闭原则的实现

实现开闭原则的方法如下:
开闭原则具有以下优势:
实现开闭原则具有以下挑战:

开闭原则实例

接下来,将通过一个具体的 C++ 示例来展示开闭原则的实现。

我们会从一个初始设计开始,这个设计没有遵循开闭原则,然后通过重构展示如何使得这个设计符合开闭原则,允许系统对扩展开放而对修改关闭。

1) 初始设计

假设有一个简单的支付系统,其中 PaymentProcessor 类用于处理支付。最初的设计中,PaymentProcessor 直接实现了信用卡支付的处理逻辑。随着系统的发展,如果需要支持新的支付方式,如 PayPal 或者银行转账,就需要修改 PaymentProcessor 类的代码,这违反了开闭原则。
#include <iostream>
#include <string>
class PaymentProcessor {
public:
    void processPayment(const std::string& paymentType, double amount) {
        if (paymentType == "CreditCard") {
            std::cout << "Processing credit card payment of $" << amount << std::endl;
        }
        // 随着新支付方式的增加,这里需要不断修改和添加新的条件判断
    }
};
int main() {
    PaymentProcessor processor;
    processor.processPayment("CreditCard", 100.0);
    return 0;
}

2) 重构设计

为了遵循开闭原则,将引入一个抽象基类 PaymentMethod,它定义了一个纯虚函数 processPayment。然后,为每种支付方式创建一个派生类。这样,PaymentProcessor 类可以使用这些派生类来处理具体的支付方式,而无须修改其代码。
#include <iostream>
#include <string>
#include <memory>
class PaymentMethod {
public:
    virtual ~PaymentMethod() {}
    virtual void processPayment(double amount) = 0;
};
class CreditCardPayment : public PaymentMethod {
public:
    void processPayment(double amount) override {
        std::cout << "Processing credit card payment of $" << amount << std::endl;
    }
};
class PayPalPayment : public PaymentMethod {
public:
    void processPayment(double amount) override {
        std::cout << "Processing PayPal payment of $" << amount << std::endl;
    }
};
class PaymentProcessor {
public:
    void processPayment(PaymentMethod* method, double amount) {
        method->processPayment(amount);
    }
};
int main() {
    CreditCardPayment creditCard;
    PayPalPayment payPal;
    PaymentProcessor processor;
    processor.processPayment(&creditCard, 100.0);
    processor.processPayment(&payPal, 200.0);
    return 0;
}
通过引入抽象基类 PaymentMethod 和具体的派生类,PaymentProcessor 类现在可以处理多种支付方式而不需直接修改其代码。新的支付方法可以通过添加新的派生类来实现,完全不触碰现有的类。这样,支付系统就对扩展开放(可以容易地添加新的支付方式),而对修改关闭(不需要修改 PaymentProcessor 类或其他已有代码)。

这个例子展示了如何通过使用多态和抽象基类在 C++ 中实现开闭原则,从而提高代码的灵活性和可维护性。通过这种设计,系统可以在不破坏现有功能的前提下,轻松适应未来的需求变化。

相关文章