原文链接:https://blog.youkuaiyun.com/lovelion/article/details/7537584
开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
引入了抽象图表类AbstractChart,且ChartDisplay针对抽象图表类进行编程,并通过setChart()方法由客户端来设置实例化的具体图表对象,在ChartDisplay的display()方法中调用chart对象的display()方法显示图表。如果需要增加一种新的图表,如折线图LineChart,只需要将LineChart也作为AbstractChart的子类,在客户端向ChartDisplay中注入一个LineChart对象即可,无须修改现有类库的源代码。
c++代码实现
#include <iostream>
using namespace std;
class AbstrcatChart
{
public:
AbstrcatChart() {}
virtual ~AbstrcatChart() {}
virtual void display() = 0;
};
class PieChart :public AbstrcatChart
{
public:
PieChart() {}
~PieChart() {}
virtual void display()
{
std::cout << "PieChart display." << std::endl;
}
};
class BarChart :public AbstrcatChart
{
public:
BarChart() {}
~BarChart() {}
virtual void display()
{
std::cout << "BarChart display." << std::endl;
}
};
class LineChart :public AbstrcatChart
{
public:
LineChart() {}
~LineChart() {}
virtual void display()
{
std::cout << "LineChart display." << std::endl;
}
};
class ChartDisplay
{
public:
ChartDisplay() {}
~ChartDisplay() {}
void setChart(AbstrcatChart* chart)
{
m_chart = chart;
}
void display()
{
m_chart->display();
}
AbstrcatChart* m_chart;
};
int main()
{
ChartDisplay* stChartDisplay = new ChartDisplay;
BarChart *stBarChart = new BarChart;
stChartDisplay->setChart(stBarChart);
stChartDisplay->display();
LineChart* stLineChart = new LineChart;
stChartDisplay->setChart(stLineChart);
stChartDisplay->display();
delete stLineChart;
delete stBarChart;
delete stChartDisplay;
return 0;
}