1.为某CRM中可以使用不同的方式显示图表,饼状图和柱状图等,原始设计方案如图1所示。
图1 CRM初始设计方案结构图
为了支持多种图表显示方式,在类ChartDisplay方法display(string type)中存在如下代码段:
If(type.equals(“pie”))
{PieChart chart =new PieChart();
Chart.display();
}
else if (type.equals(“bar”)
{ BarChart = new BarChart();
Chart.display();
}
如果需要增加一个新的图表类,如折线图LineChart,则需要修改ChartDisplay类的display()方法的源代码,违反了开闭原则。请大家考虑一下,如何对该设计进行重构,使之符合开闭原则。
答:1.1类图
1.2 程序代码:
public class OCPClient {
private ChartDisplay chartDisplay;
public void setChartDisplay(ChartDisplay chartDisplay) {
this.chartDisplay = chartDisplay;
}
public void display(){
chartDisplay.display();
}
public static void main(String[] args) {
OCPClient ocpClient = new OCPClient();
ocpClient.setChartDisplay(new BarChart());
ocpClient.display();
}
}
abstract class ChartDisplay{
public abstract String display();
}
class PieChart extends ChartDisplay {
@Override
public String display() {
return "饼状图";
}
}
class BarChart extends ChartDisplay {
@Override
public String display() {
return "柱状图";
}
}
class LineChart extends ChartDisplay {
@Override
public String display() {
return "折线图";
}
}
1.3 程序运行结果: