开闭原则

 

定义:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。(可以编写可扩展的软件)。

在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。

为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。在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 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值