设计原则之开闭原则

153 阅读2分钟

注意:设计原则是设计模式的前提,写代码尽可能的考虑,有时候要舍弃一些东西。

1. 开闭原则

是指一个软件实体如类、模块和函数应该对扩展开放, 对修改关闭。

比如一个系统已经上线了,新增了业务或者需求,这时,不能去修改原有的代码,因为不知道这些代码在哪里使用了,如果去修改了,是极大的风险,系统变得不稳定。

Demo:  以学习课程为例

public interface ICourse {
    Integer getId();

    String getName();

    Double getPrice();
}

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;
    }

    @Override
    public Integer getId() {
        return id;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public Double getPrice() {
        return price;
    }
}

// 测试类
public class MainTest {
    public static void main(String[] args) {
        ICourse course = new JavaCourse(1,"java",23D);
        System.out.println("课程价格: " + course.getPrice());

    }
}

以上代码很完美,但是如果现在JAVA课程打折,获取打折价格咋办?
一看就很简单啊,我们可以在JavaCourse类里加一个打折价格的方法,但是这样就违背了开闭原则,那如果是新建一个类继承JavaCourse类呢?

public class JavaDisCountCourse extends JavaCourse {
    public JavaDisCountCourse(Integer id, String name, Double price) {
        super(id, name, price);
    }
// 我们新加了一个方法,并没有直接重写父类的getPrice方法,
//这里涉及到里氏替换原则,看后面文章。如果我直接重写,
//那么我又想获取打折后的价格,又想获取原价,重新就无法满足了
    public Double getDiscountPrice() {
        return super.getPrice() * 0.8;
    }
}

// 测试类
public class MainTest {
    public static void main(String[] args) {
        JavaDisCountCourse course = new JavaDisCountCourse(1,"java",23D);
        System.out.println("课程打折后的价格: " + course.getDiscountPrice() + "--- 课程的原价:"+ course.getPrice());
    }
}

开闭原则是最终目标,在实际过程中由于人力,时间,成本等因素不可能百分百的做到。

优点:
可以提供软件复用性,提高系统稳定性

缺点:
可能导致类的膨胀