定义:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。(可以编写可扩展的软件)。
在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。在Java、C#等编程语言中,可以为系统定义一个相对稳定的抽象层,而将不同的实现行为移至具体的实现层中完成。在很多面向对象编程语言中都提供了接口、抽象类等机制,可以通过它们定义系统的抽象层,再通过具体类来进行扩展。如果需要修改系统的行为,无须对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。
旁白:只需要我们定义好抽象的父类或者说是抽象的接口,然后后面的开发就是不断去写它的实现类就行。
+
Sunny软件公司开发的CRM系统可以显示各种类型的图表,如饼状图和柱状图等,为了支持多种图表显示方式,原始设计方案如图1所示:
在ChartDisplay类里面的display()方法里面可能会写这样的代码:
if(type.equals("pie")) {
PieChart chart = new PieChart();
chart.display();
}else if(type.equals("bar")) {
BarChart chart = new BarChart();
chart.display();
}
将来要是扩展一个新的图表类那就得修改这个里面的代码,这就违反了开闭原则。现在重构一下:
1)增加一个抽象的图表类AbstractChart,将各种具体的图表类作为子类;
2)ChartDisplay类针对抽象图表类进行编程,由客户端来决定使用哪种具体图表。
示例代码:
public abstract class AbstractChart {
public void display() {}
}
public class PieChart extends AbstractChart {
@Override
public void display(){
System.out.println("this is pie chart");
}
}
public class BarChart extends AbstractChart {
@Override
public void display() {
System.out.println("this is bar chart");
}
}
public class CharDisplay {
private AbstractChart chart;
public void setChart(AbstractChart chart){
this.chart = chart;
}
public void display(){
chart.display();
}
public static void main(String[] args) {
CharDisplay charDisplay = new CharDisplay();
charDisplay.setChart(new BarChart());// 设置这个具体的实现类。在调用的时候自己指定用哪个实现类
charDisplay.display();
}
}
---------------------
作者:爱你们的巴巴
来源:CSDN
原文:https://blog.csdn.net/cainiao_user/article/details/77468327
版权声明:本文为博主原创文章,转载请附上博文链接!