什么是依賴注入(Dependency Injection)?它在 C++ 中是如何實現的?
依賴注入(Dependency Injection,DI)是一種設計模式,用于減少軟件組件之間的耦合度,提高代碼的可測試性、可維護性和可擴展性。在依賴注入中,組件的依賴關系不是在組件內部創建或硬編碼的,而是通過外部提供的方式注入到組件中。
實現方式:
在 C++ 中,依賴注入可以通過以下幾種方式實現:
構造函數注入:通過組件的構造函數接收依賴對象。
#include <iostream>class Service {
public:void execute() {std::cout << "Service executed" << std::endl;}
};class Client {
private:Service& service;public:Client(Service& s) : service(s) {}void run() {service.execute();}
};int main() {Service s;Client c(s);c.run();return 0;
}
成員變量注入:通過組件的成員變量接收依賴對象。
#include <iostream>class Service {
public:void execute() {std::cout << "Service executed" << std::endl;}
};class Client {
private:Service& service;public:Client() : service(Service()) {} // 成員變量初始化時注入依賴對象void run() {service.execute();}
};int main() {Client c;c.run();return 0;
}
函數參數注入:通過函數參數傳遞依賴對象。
#include <iostream>class Service {
public:void execute() {std::cout << "Service executed" << std::endl;}
};void run(Service& service) {service.execute();
}int main() {Service s;run(s);return 0;
}
接口注入:通過接口或抽象類定義依賴對象,由外部實現并注入到組件中。
#include <iostream>class IService {
public:virtual void execute() = 0;virtual ~IService() {}
};class Service : public IService {
public:void execute() override {std::cout << "Service executed" << std::endl;}
};class Client {
private:IService& service;public:Client(IService& s) : service(s) {}void run() {service.execute();}
};int main() {Service s;Client c(s);c.run();return 0;
}
通過以上方式,依賴對象的創建和管理被推遲到了組件外部,使得組件更加靈活、可測試和可復用,同時降低了組件之間的耦合度,提高了系統的可維護性和可擴展性。