C++ 语言 设计模式与 SOLID 原则示例

C++阿木 发布于 2 天前 3 次阅读


C++ 设计模式与 SOLID 原则示例

在设计软件时,遵循良好的设计模式和原则是非常重要的。设计模式是一套被反复使用的、多数人认可的、经过分类编目的、代码设计经验的总结。而SOLID原则是一组指导软件设计时应该遵循的五个原则,它们可以帮助我们创建可维护、可扩展和可测试的代码。本文将通过C++语言的示例,展示如何将设计模式与SOLID原则结合起来,以实现一个简单的银行账户管理系统。

设计模式

单例模式(Singleton)

单例模式确保一个类只有一个实例,并提供一个全局访问点。在银行账户管理系统中,我们可以使用单例模式来管理数据库连接。

cpp
include
include

class Database {
private:
static Database instance;
static std::mutex mutex;

protected:
Database() {}
~Database() {}

public:
static Database getInstance() {
if (instance == nullptr) {
std::lock_guard lock(mutex);
if (instance == nullptr) {
instance = new Database();
}
}
return instance;
}
};

Database Database::instance = nullptr;
std::mutex Database::mutex;

int main() {
Database db1 = Database::getInstance();
Database db2 = Database::getInstance();

std::cout << "db1 and db2 are the same instance: " << (db1 == db2) << std::endl;

return 0;
}

工厂模式(Factory)

工厂模式用于创建对象,而不直接指定对象的具体类。在银行账户管理系统中,我们可以使用工厂模式来创建不同类型的账户。

cpp
include
include

class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};

class SavingsAccount : public Account {
public:
void deposit(double amount) override {
std::cout << "SavingsAccount: Deposited " << amount << std::endl;
}

void withdraw(double amount) override {
std::cout << "SavingsAccount: Withdrawn " << amount << std::endl;
}
};

class CheckingAccount : public Account {
public:
void deposit(double amount) override {
std::cout << "CheckingAccount: Deposited " << amount << std::endl;
}

void withdraw(double amount) override {
std::cout << "CheckingAccount: Withdrawn " << amount << std::endl;
}
};

class AccountFactory {
public:
static std::shared_ptr createAccount(const std::string& type) {
if (type == "savings") {
return std::make_shared();
} else if (type == "checking") {
return std::make_shared();
}
return nullptr;
}
};

int main() {
auto account = AccountFactory::createAccount("savings");
account->deposit(1000);
account->withdraw(500);

return 0;
}

SOLID 原则

单一职责原则(Single Responsibility Principle)

单一职责原则要求一个类只负责一项职责。以下是一个遵循单一职责原则的示例:

cpp
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};

class SavingsAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}

void withdraw(double amount) override {
// 实现取款逻辑
}
};

class CheckingAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}

void withdraw(double amount) override {
// 实现取款逻辑
}
};

开放封闭原则(Open/Closed Principle)

开放封闭原则要求软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。以下是一个遵循开放封闭原则的示例:

cpp
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};

class SavingsAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}

void withdraw(double amount) override {
// 实现取款逻辑
}
};

class CheckingAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}

void withdraw(double amount) override {
// 实现取款逻辑
}
};

依赖倒置原则(Dependency Inversion Principle)

依赖倒置原则要求高层模块不应该依赖于低层模块,两者都应该依赖于抽象。以下是一个遵循依赖倒置原则的示例:

cpp
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};

class AccountManager {
public:
void addAccount(std::shared_ptr account) {
// 添加账户
}

void deposit(std::shared_ptr account, double amount) {
account->deposit(amount);
}

void withdraw(std::shared_ptr account, double amount) {
account->withdraw(amount);
}
};

接口隔离原则(Interface Segregation Principle)

接口隔离原则要求多个特定客户端接口,而不是单一宽泛接口。以下是一个遵循接口隔离原则的示例:

cpp
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};

class SavingsAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}

void withdraw(double amount) override {
// 实现取款逻辑
}
};

class CheckingAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}

void withdraw(double amount) override {
// 实现取款逻辑
}
};

实现依赖倒置原则(Liskov Substitution Principle)

实现依赖倒置原则要求子类必须能够替换其基类。以下是一个遵循实现依赖倒置原则的示例:

cpp
class Account {
public:
virtual void deposit(double amount) = 0;
virtual void withdraw(double amount) = 0;
virtual ~Account() {}
};

class SavingsAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}

void withdraw(double amount) override {
// 实现取款逻辑
}
};

class CheckingAccount : public Account {
public:
void deposit(double amount) override {
// 实现存款逻辑
}

void withdraw(double amount) override {
// 实现取款逻辑
}
};

总结

本文通过C++语言的示例,展示了如何将设计模式与SOLID原则结合起来,以实现一个简单的银行账户管理系统。遵循这些原则和模式可以帮助我们创建更加健壮、可维护和可扩展的代码。在实际项目中,我们应该根据具体需求灵活运用这些原则和模式。