依赖倒置原则(Dependence Inversion Principle,DIP)是 Object Mentor 公司总裁罗伯特·马丁(Robert C.Martin)于 1996 年在 C++ Report 上发表的文章。
依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。其核心思想是:要面向接口编程,不要面向实现编程。
依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合。
#include <QCoreApplication>
#include <iostream>
using namespace std;
//------------------------------------------------------
//银行工作人员
class BankWork{
public:
void SaveServer(){
cout<<"SaveServer"<<endl;
}
void PayServer(){
cout<<"PayServer"<<endl;
}
void tranferServer(){
cout<<"tranferServer"<<endl;
}
};
//中层模块,对BankWork类依赖大
void DoSave(BankWork* work){
work->SaveServer();
}
void DoPay(BankWork* work){
work->PayServer();
}
void DOTranfer(BankWork* work){
work->tranferServer();
}
void testDemo1(){
BankWork* work = new BankWork;
DoSave(work);
DoPay(work);
DOTranfer(work);
delete work;
}
//------------------------------------------------------
class AbstractBankWork{
public:
virtual void Dobussiness()=0;
};
class SaveBankWork:public AbstractBankWork{
public:
virtual void Dobussiness(){
cout<<"SaveServer"<<endl;
}
};
class PayWork:public AbstractBankWork{
public:
virtual void Dobussiness(){
cout<<"PayServer"<<endl;
}
};
class TranferBankWork:public AbstractBankWork{
public:
virtual void Dobussiness(){
cout<<"tranferServer"<<endl;
}
};
//中层模块 依赖抽象
void Dobussiness(AbstractBankWork* work){
work->Dobussiness();
delete work;
}
void testDemo2(){
Dobussiness(new SaveBankWork);
Dobussiness(new PayWork);
Dobussiness(new TranferBankWork);
}
//------------------------------------------------------
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
testDemo1();
cout<<endl;
testDemo2();
return a.exec();
}