前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式原则:开放封闭原则

设计模式原则:开放封闭原则

作者头像
运维开发王义杰
发布2023-08-10 14:44:43
1650
发布2023-08-10 14:44:43
举报
文章被收录于专栏:运维开发王义杰

开放封闭原则

开放封闭原则表示一个软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。也就是说,一个软件实体应该在不修改原有代码的前提下,可以扩展新的功能。

开放封闭原则是设计模式的核心原则,它体现了软件的灵活性和稳定性。如果一个软件能够满足开放封闭原则,那么它就具有以下两个优点:

  • 能够扩展已有的功能,满足新的需求,具有很强的适应性和灵活性。
  • 不需要修改已有的代码,保证了原有功能的稳定性和可靠性。

举个例子,假设我们有一个计算器类 Calculator,它可以根据用户输入的表达式进行计算。最初,它只支持加法运算,代码如下:

代码语言:javascript
复制
class Calculator {
    public int calculate(String expression) {
        // 如果表达式是加法运算,返回计算结果
        if (expression.contains("+")) {
            String[] numbers = expression.split("\\+");
            int result = 0;
            for (String number : numbers) {
                result += Integer.parseInt(number);
            }
            return result;
        }
        // 否则抛出异常
        else {
            throw new IllegalArgumentException("Invalid expression");
        }
    }
}

这个类违反了开放封闭原则,因为如果我们想要增加其他运算符,比如减法、乘法、除法等,就必须修改 calculate() 方法的逻辑,这样就会破坏原有的功能,并且增加了出错的可能性。

为了遵循开放封闭原则,我们应该将 Calculator 类设计成一个抽象类,并定义一个抽象方法 calculate()。然后,针对每一种运算符,定义一个子类来继承 Calculator 类,并实现 calculate() 方法。这样,如果我们想要增加新的运算符,只需要增加一个新的子类即可,不需要修改原有的代码。代码如下:

代码语言:javascript
复制
abstract class Calculator {
    public abstract int calculate(String expression);
}


class AddCalculator extends Calculator {
    @Override
    public int calculate(String expression) {
        // 如果表达式是加法运算,返回计算结果
        if (expression.contains("+")) {
            String[] numbers = expression.split("\\+");
            int result = 0;
            for (String number : numbers) {
                result += Integer.parseInt(number);
            }
            return result;
        }
        // 否则抛出异常
        else {
            throw new IllegalArgumentException("Invalid expression");
        }
    }
}


class SubCalculator extends Calculator {
    @Override
    public int calculate(String expression) {
        // 如果表达式是减法运算,返回计算结果
        if (expression.contains("-")) {
            String[] numbers = expression.split("\\-");
            int result = Integer.parseInt(numbers[0]);
            for (int i = 1; i < numbers.length; i++) {
                result -= Integer.parseInt(numbers[i]);
            }
            return result;
        }
        // 否则抛出异常
        else {
            throw new IllegalArgumentException("Invalid expression");
        }
    }
}


// 其他运算符的子类省略
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开放封闭原则
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档