SOLID oop 软件开发设计原则
S
单一职责原则
一个文件,一个类只负责一个功能
O
开闭原则
对修改关闭,对扩展开发
L
里氏替换原则
设计的继承,子类要在任何情况下可以替换父类,而不发生程序性的错误
I
接口隔离原则
demo
示例代码
假设有一个打印机类,它同时支持打印和扫描功能。如果将所有功能都放在一个接口中,可能会导致某些只支持打印功能的设备也必须实现扫描功能接口,这违反了接口分离原则。
违反接口分离原则的代码:
class IMachine {
public:
virtual void print() = 0;
virtual void scan() = 0;
};
class Printer : public IMachine {
public:
void print() override {
std::cout << "Printing..." << std::endl;
}
void scan() override {
// 不支持扫描功能,但必须实现
throw std::logic_error("This printer does not support scanning");
}
};
遵循接口隔离原则的代码:
class IPrinter {
public:
virtual void print() = 0;
};
class IScanner {
public:
virtual void scan() = 0;
};
class Printer : public IPrinter {
public:
void print() override {
std::cout << "Printing..." << std::endl;
}
};
class Scanner : public IScanner {
public:
void scan() override {
std::cout << "Scanning..." << std::endl;
}
};
class AllInOne : public IPrinter, public IScanner {
public:
void print() override {
std::cout << "Printing..." << std::endl;
}
void scan() override {
std::cout << "Scanning..." << std::endl;
}
};
D
依赖倒置原则
定义:高层模块不应该依赖低层模块,二者都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象
目的:通过依赖抽象而不是具体实现,减少模块之间的耦合,提高系统的灵活性和可扩展性。
依赖导致,就是中间插入了一层抽象的代码,上层从抽象中获得数据。底层去继承抽象。
class INotification {
public:
virtual void send(const std::string& message) = 0;
};
class Email : public INotification {
public:
void send(const std::string& message) override {
std::cout << "Sending email: " << message << std::endl;
}
};
class SMS : public INotification {
public:
void send(const std::string& message) override {
std::cout << "Sending SMS: " << message << std::endl;
}
};
class Application {
private:
INotification* notification;
public:
Application(INotification* notification) : notification(notification) {}
void notify(const std::string& message) {
notification->send(message);
}
};
int main() {
Email email;
Application app(&email);
app.notify("Hello, world!");
SMS sms;
Application app2(&sms);
app2.notify("Hello, world!");
return 0;
}
F3 中 platform 是一个抽象的类,管理了 下面的3种运行的平台, cmodel , sft , uft。
上层调用方,调用的是一个 类似抽象类的概念,下面的具体实现方,是 3个平台下的 内存,上下电 和 IPC.,这就是依赖倒置。