# 开放封闭原则(Open-Closed Principle)

  • 定义:对扩展开放,对修改关闭。即软件实体尽量在不修改原有代码的情况下进行扩展。也就是说,写的代码在扩展功能的时候尽量不要影响之前的代码部分,而是能够很好的拼装在一起。

  • 作用: 实现高内聚,低耦合

  • 优点,降低了程序各部分的耦合性,为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。

开闭原则的适应性、灵活性、稳定性都很好,增加一个新功能不需要对系统基础的抽象层进行修改,只要拼接到一起就可以了,不影响系统其他的功能模块。

# OCP例子

问题:有一个图表演示系统,目前可以支持演示饼状图,柱状图,现在需要一个图形显示的管理器

代码如下:

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");
	}
}
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;
		}
	}
}
public class PieChart {//代码3
	public void display() {
		System.out.println("pie chart display");
	}
}
public class BarChart {//代码4
	public void display() {
		System.out.println("Bar chart display");
	}
}

此时类之间的关系

BarChart+ display(): voidPieChart+ display(): voidChartDisplayManager+ display(name: String): void
Use
Use
Use
Use
Viewer does not support full SVG 1.1

现在需要加一个折线图。添加折线图,需要新添一个类,并且还需要修改代码2,违反了开闭原则,所以需要修改代码的结构,新增一个抽象类BaseChart,包含有一个Display方法,使所有的图都继承它,然后修改此方法,就可以解决此问题了。

修改后的代码为:

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());
	}
}
public class ChartDisplayManager {//代码2
	public void display(BaseChart base) {
		base.display();
	}
}
public class PieChart extends BaseChart{//代码3
	public void display() {
		System.out.println("pie chart display");
	}
}
public class BarChart extends BaseChart{//代码4
	public void display() {
		System.out.println("Bar chart display");
	}
}
public class LineChart extends BaseChart{//代码5
	public void display() {
		System.out.println("Line chart display");
	}
}
public abstract class BaseChart {//代码6
	public abstract void display();
}

类之间的关系

BaseChart+ display(): voidBarChart+ display(): voidPieChart+ display(): voidLineChart+ display(): voidChartDisplayManager+ display(base: BaseChart): void
Extends
Extends
Extends
Extends
Extends
Extends
Use
Use
Viewer does not support full SVG 1.1