设计模式|原则—开闭原则

开闭原则

定义:

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

用抽象构建框架,用实体扩展细节。

优点;

提高软件系统的可复用性及可维护性。

问题由来:

在软件的生命周期中,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码进过重新测试。

解决方案:

当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

实现开闭原则的重点是面向抽象编程。

代码演示:

有一个接口:

  • ICourse.java
package com.design.principle.openclose;

/**
 * @Author: JLU Tiger
 * @Date: 2019/8/28 16:13
 */
public interface ICourse {
    Integer getId();
    String getName();
    Double getPrice();
}

实现类:

  • JavaCourse.java
package com.design.principle.openclose;

/**
 * @Author: JLU Tiger
 * @Date: 2019/8/28 16:15
 */
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 this.id;
    }

    public String getName() {
        return this.name;
    }

    public Double getPrice() {
        return this.price;
    }
}

测试类:

  • Test.java
package com.design.principle.openclose;

/**
 * @Author: JLU Tiger
 * @Date: 2019/8/28 16:17
 */
public class Test {
    public static void main(String[] args) {
        ICourse javaCourse = new JavaCourse(96, "Java从零到企业级开发", 348d);
        System.out.println("课程id:" + javaCourse.getId() + "课程名称:" + javaCourse.getName()
        + "课程价格:" + javaCourse.getPrice());
    }
}

当我们要进行打折的时候,应该怎么做呢?

在接口中增加一个打折的函数:

package com.design.principle.openclose;

/**
 * @Author: JLU Tiger
 * @Date: 2019/8/28 16:13
 */
public interface ICourse {
    Integer getId();
    String getName();
    Double getPrice();
    Double getDiscountPrice();
}

并在java课程中实现该方法:

public Double getDiscountPrice() {
     return this.price * 0.8;
}

但是我们在修改时,修改了接口,当我们的课程类型很多的时候,所有的课程实现类都要实现该方法,我们的接口不应该经常变化,它应该是稳定的。

那么,我们应该怎么办呢?如果不修改接口,通过扩展增加一个java打折类呢?

  • JavaDiscountCourse.java
package com.design.principle.openclose;

/**
 * @Author: JLU Tiger
 * @Date: 2019/8/28 16:29
 */
public class JavaDiscountCourse extends JavaCourse {
    public JavaDiscountCourse(Integer id, String name, Double price) {
        super(id, name, price);
    }

    @Override
    public Double getPrice() {
        return super.getPrice() * 0.8;
    }
}

如果要获得原价的话,需要在折扣方法中添加:

package com.design.principle.openclose;

/**
 * @Author: JLU Tiger
 * @Date: 2019/8/28 16:29
 */
public class JavaDiscountCourse extends JavaCourse {
    public JavaDiscountCourse(Integer id, String name, Double price) {
        super(id, name, price);
    }

    public Double getOriginPrice() {
        return super.getPrice();
    }

    @Override
    public Double getPrice() {
        return super.getPrice() * 0.8;
    }
}

在使用的时候,获取原价的时候需要强转:

package com.design.principle.openclose;

/**
 * @Author: JLU Tiger
 * @Date: 2019/8/28 16:17
 */
public class Test {
    public static void main(String[] args) {
        ICourse iCourse = new JavaDiscountCourse(96, "Java从零到企业级开发", 348d);
        JavaDiscountCourse javaCourse = (JavaDiscountCourse) iCourse;
        System.out.println("课程id:" + javaCourse.getId() + " 课程名称:" + javaCourse.getName()
                + " 课程折后价:" + javaCourse.getPrice() + " 课程原价:" + javaCourse.getOriginPrice());
    }
}

以上便是开闭原则的简单使用。

原文地址:https://www.cnblogs.com/jlutiger/p/11425077.html