定义:
- 高层模块不应该以来低层模块,两个都应该依赖抽象
- 抽象不应该依赖细节,细节应该依赖抽象
核心思想:针对接口编程,不要对实现编程
使用时,应遵循以下3点
- 低层模块或高层模块尽量都要有抽象类,或者两者都有
- 变量的声明类型尽量是抽象类
- 使用继承时遵循里式替换原则
举例:语文老师教语文可以有多种途径,如课堂上面对面、在线视频等
教学方式接口,所有的教学方式实现该接口
#include <string>
class TeachWay
{
public:
TeachWay();
virtual ~TeachWay();
virtual std::string getWay() = 0; // 获取方式
};
老师教学函数,针对教学接口编程,与真正的教学方式解耦
// 定义
virtual void teach(TeachWay *way);
// 实现
void Teacher::teach(TeachWay *way)
{
std::cout << "I teache a course " + way->getWay() << std::endl;
}
课程上教学,继承TeachWay, 并实现getWay()函数
std::string TeachClass::getWay()
{
return "in class";
}
在线教学,继承TeachWay, 并实现getWay()函数
std::string TeachOnline::getWay()
{
return "online";
}
客户端
#include "Teacher.h"
#include "TeachClass.h"
#include "TeachOnline.h"
int main(int agrc, char* argv[])
{
// 创建教学方式
TeachClass tc;
TeachOnline to;
// 创建老师
Teacher th;
// 老师通过不同的方式教学
th.teach(&tc);
th.teach(&to);
getchar();
return 0;
}
运行结果
源码地址