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 程序運行結果: