开放封闭原则(Open-Closed Principle)
开闭原则的适应性、灵活性、稳定性都很好,增加一个新功能不需要对系统基础的抽象层进行修改,只要拼接到一起就可以了,不影响系统其他的功能模块。
OCP例子
问题:有一个图表演示系统,目前可以支持演示饼状图,柱状图,现在需要一个图形显示的管理器
代码如下:
1
2
3
4
5
6
7
8
|
public class Main {//代码1
public static void main(String[] args) {
System.out.println("this is OCP");
ChartDisplayManager manager = new ChartDisplayManager();
manager.display("bar");
manager.display("pie");
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class ChartDisplayManager {//代码2
public void display(String name) {
// TODO Auto-generated method stub
switch (name) {
case "pie":
new PieChart().display();
break;
case "bar":
new BarChart().display();
break;
default:
break;
}
}
}
|
1
2
3
4
5
|
public class PieChart {//代码3
public void display() {
System.out.println("pie chart display");
}
}
|
1
2
3
4
5
|
public class BarChart {//代码4
public void display() {
System.out.println("Bar chart display");
}
}
|
此时类之间的关系
BarChart+ display(): voidPieChart+ display(): voidChartDisplayManager+ display(name: String): voidUseUseUseUseViewer does not support full SVG 1.1
现在需要加一个折线图。添加折线图,需要新添一个类,并且还需要修改代码2,违反了开闭原则,所以需要修改代码的结构,新增一个抽象类BaseChart
,包含有一个Display
方法,使所有的图都继承它,然后修改此方法,就可以解决此问题了。
修改后的代码为:
1
2
3
4
5
6
7
8
9
|
public class Main {//代码1
public static void main(String[] args) {
System.out.println("this is OCP");
ChartDisplayManager manager = new ChartDisplayManager();
manager.display(new BarChart());
manager.display(new PieChart());
manager.display(new LineChart());
}
}
|
1
2
3
4
5
|
public class ChartDisplayManager {//代码2
public void display(BaseChart base) {
base.display();
}
}
|
1
2
3
4
5
|
public class PieChart extends BaseChart{//代码3
public void display() {
System.out.println("pie chart display");
}
}
|
1
2
3
4
5
|
public class BarChart extends BaseChart{//代码4
public void display() {
System.out.println("Bar chart display");
}
}
|
1
2
3
4
5
|
public class LineChart extends BaseChart{//代码5
public void display() {
System.out.println("Line chart display");
}
}
|
1
2
3
|
public abstract class BaseChart {//代码6
public abstract void display();
}
|
类之间的关系
BaseChart+ display(): voidBarChart+ display(): voidPieChart+ display(): voidLineChart+ display(): voidChartDisplayManager+ display(base: BaseChart): voidExtendsExtendsExtendsExtendsExtendsExtendsUseUseViewer does not support full SVG 1.1