设计原则之开闭原则详解

一、开闭原则定义:

一个软件实体如类、模块、函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现实现细节。
  • 也就是说我们如果想实现某种变化,不应该修改原类或模块实现相应的功能细节,而是对原类或模块实体进行扩张 继承来具体实现某一变化。
  • 一个软件实体在使用过程中许多模块都会不断发生变化,以修改某商品价格为例,如果频繁修改原功能模块,则需要频繁打包上架重启,开闭原则可以提高软件系统的可复用性、灵活性和可维护性。
下面我们用一个例子来理解开闭原则:
先写一个课程接口,定义公共使用的方法
/**
 * 定义个课程接口,定义公共行为方法
 * getName() 课程名称
 * getPrice() 课程价格
 */
public interface ICourse {
    Integer getId();
    
    String  getName();
    
    Double getPrice();
}

实现一个java课程类实现公共课程接口
public class JavaCourse implements ICourse{

    private Integer id;

    private String name;

    private Double price;

    public JavaCourse(Integer id, String name, Double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public Integer getId() {
        return id;
    }
    
    public String getName() {
        return name;
    }

    public Double getPrice() {
        return price * 0.8;//常规修改下的课程价格打8折
    }
}
写一个main方法测试类

在main方法中初始化一个java课程信息并输出

public class OpenCourseTest {

    public static void main(String[] args) {
        ICourse course = new JavaCourse(1,"javaEE",99D);
        System.out.println("课程ID:" + course.getId() +
                "\n课程名称:《" + course.getName() +"》" +
                "\n课程价格:" + course.getPrice()
        );
    }
}

得到如下结果
课程ID:1
课程名称:《javaEE》
课程价格:79.2
  • 这样写暴露出一个问题,就是每次使用不同的折扣都需要修改一次JavaCourse类,可能就会造成频繁的原逻辑修改,在复杂的业务中容易出问题。
  • 此时,原来的代码我们就不要去修改了,关闭原来代码的修改,扩展原代码,通过继承原代码类实现需求细节的修改。让我们的项目代码风险可控。
我们重写一个打折类,在类中实现细节:
public class JavaDiscountCourse extends JavaCourse{

    public JavaDiscountCourse(Integer id, String name, Double price) {
        super(id, name, price);
    }
    //修改后的价格 可加入其他业务逻辑
    public Double getDisCountPrice() {
        return super.getPrice() * 0.6;//打6折
    }
}
再修改main测试类
public class OpenCourseTest {

    public static void main(String[] args) {
        ICourse course = new JavaDiscountCourse(1,"javaEE",99D);
        System.out.println("课程ID:" + course.getId() +
                "\n课程名称:《" + course.getName() +"》" +
                "\n课程原价:" + course.getPrice() +
                "\n课程折价:" + ((JavaDiscountCourse)course).getDisCountPrice()
        );
    }
}
得到结果如下:
课程ID:1
课程名称:《javaEE》
课程原价:99.0
课程折价:59.4
  • 现在打折例子完成了,我们只是增加了一个JavaDiscountCourse 类,我们没有修改底层模块,代码改变量少,可以有效的防止风险的扩散。
  • 如果要修改代码中某些逻辑实现细节的变化,尽量避开低层代码的逻辑,如果要修改低层代码,你要确定都有哪些高层次的代码使用了这些低层次代码,做统一的修改,低层次的代码的修改,肯定会引起高层次引用代码的变化,牵一发而动全身。所以尽量使用开闭原则,对原低层次代码进行扩展实现。
  • 开闭原则是最基础的设计原则,其他五个原则都是以开闭原则为基础,你也可以这么理解:开闭原则是抽象类,其他五个设计原则是具体实现类,是指导设计的工具和方法。
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值