定义: 对软件实体(类、模块、函数),扩展可以开放,修改应该封闭。
优点:
- 可维护
- 可扩展
- 可复用
- 灵活性高
举例:
学校里有一名老师教语文
// Teacher.h
class Teacher
{
public:
void teach();
};
// Teacher.cpp
#include "Teacher.h"
#include <iostream>
void Teacher::teach()
{
std::cout << "I teache chinese." << std::endl;
}
现在需要增加一名老师数学,此时我们需要不应去修改Teacher的teach方法,而是对Teacher类进行抽象,为后期同样的变化做好准备工作(如需要英语老师、体育老师等),新老师只需实现teach方法即可;不然新增一个老师,我们就得修改一次teach方法,而且此次修改可能对以前的代码造成不良影响。
// 抽象后的Teacher
class Teacher
{
public:
Teacher();
virtual ~Teacher();
virtual void teach();
};
需要语文老师,就定义一个语文老师类,实现Teach方法
#include "Teacher.h"
class ChineseTeacher : public Teacher
{
public:
ChineseTeacher();
~ChineseTeacher();
virtual void teach();
};
需要数学老师,就定义一个数学老师类,实现Teach方法
#include "Teacher.h"
class MathTeacher : public Teacher
{
public:
MathTeacher();
~MathTeacher();
virtual void teach();
};
如此,需要新科目的老师,只需扩展一个科目老师类即可,不必修改原有类,减少对原有代码的影响,灵活、高效
客户端
#include <iostream>
#include "ChineseTeacher.h"
#include "MathTeacher.h"
int main(int agrc, char* argv[])
{
ChineseTeacher chineseTh;
MathTeacher mathTh;
chineseTh.teach();
mathTh.teach();
getchar();
return 0;
}
运行结果
源码地址