什么是 依赖注入 dependency injection
如果一个函数(或者类)依赖某个类的实例来实现某个功能,最直接的做法是在这个函数中建立一个实例, 然后调用这个实例的某个函数去实现这个功能, 例如
class Car
{
public:
void run(){ cout<<"car running now\n"; };
};
void deliver()
{
Car car;
car.run();
}
问题: 但如果所依赖的对象有多种选择, 而且这种选择未来可能会增加, 就需要不停的修改此函数(which is very bad).
解决办法: 更好的办法是,将所依赖的对象以参数的形式传给该函数, 也就是所谓的dependency injection. 为了保证调用函数的统一性,最好创建一个虚类(接口类), 如下
class IVehicle
{
public:
virtual void run() = 0;
};
class Car: public IVehicle
{
public:
void run(){ cout<<"car running now\n"; };
};
class eBike: public IVehicle
{
public:
void run(){ cout<<"eBike running now\n"; };
};
void deliver(IVehicle* veh)
{
if(veh != nullptr)
{
v->run();
}
}
依赖注入可以通过两种方式来实现:
- 通过普通参数传入
- 通过构造函数传入
- 通过setter 函数