设计模式系列--23种常见设计模式之开放封闭原则(3)

概念

开放封闭原则(OCP,Open Closed Principle)是所有面向对象原则的核心。
软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。
对于开放,我们是指在对外扩展,新需求,新功能需要加入,我们的软件本身是易于扩展的,所以“适应时代的发展需要”;
对于封闭,我们是指软件本身的功能是不允许修改的,要保持独立性和稳定性,避免再次发生改动。

问题由来

比如我们有个实现各种计算的功能,加减乘除,现在需要再加上 取余运算;
此时 需要在原有的实现类中 添加相应的功能,
一方面需要修改现有类,需要了解原有逻辑;
另一方面,扩展之后难免引入其他问题,甚至造成其他功能不稳定,不利于维护;

shut up and show my code:(别BB,上代码)

package demo;

/**
 * @author WeiSong <br>
 * @since 0.0.1
 * 2020/11/2 15:13
 */
public class Calculate {

    public int add(int a, int b) {
        return a + b;
    }

    public int sub(int a, int b) {
        return a - b;
    }

    public int muti(int a, int b) {
        return a * b;
    }

    public int div(int a, int b) {
        return a / b;
    }


    public static void main(String[] args) {

        Calculate calculate = new Calculate();
        int a = 10, b = 5;
        int result = calculate.add(a, b);
        System.out.println(result);
        result = calculate.sub(a, b);
        System.out.println(result);
        result = calculate.muti(a, b);
        System.out.println(result);
        result = calculate.div(a, b);
        System.out.println(result);

    }


}

产生原因

耦合度太高,抽象层面不够,扩展起来比较困难。

解决方案  

可以抽象出一个计算接口,具体的功能在实现类中完成。

接口:

package demo;

/**
 * @author WeiSong <br>
 * @since 0.0.1
 * 2020/11/2 15:25
 */
public interface Calculate {

    int calculate(int a, int b);
}

具体实现:

package demo;

/**
 * @author WeiSong <br>
 * @since 0.0.1
 * 2020/11/2 15:26
 */
public class AddCalculate implements Calculate {
    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
}
package demo;

/**
 * @author WeiSong <br>
 * @since 0.0.1
 * 2020/11/2 15:28
 */
public class SubCalculate implements Calculate {
    @Override
    public int calculate(int a, int b) {
        return a - b;
    }
}

新增一个功能:直接基于接口去实现,原有的都不用动。

package demo;

/**
 * @author WeiSong <br>
 * @since 0.0.1
 * 2020/11/2 15:29
 */
public class RemainCalculate implements Calculate {
    @Override
    public int calculate(int a, int b) {
        return a % b;
    }
}

编者按:

上面的小栗子解释了这个原则的一种情况,实际的系统中业务功能会很多,耦合度也会很高,所以开放封闭原则其实也是我们需要遵循的一个基本原则。思想理念就是 尽量抽象和解耦,易于扩展

猜你喜欢

转载自blog.csdn.net/weisong530624687/article/details/109450042