开闭原则重构

1.为某CRM中可以使用不同的方式显示图表,饼状图和柱状图等,原始设计方案如图1所示。
开闭原则重构_第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类图

开闭原则重构_第2张图片
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 程序运行结果:
开闭原则重构_第3张图片

你可能感兴趣的:(23种设计模式)