天天看点

设计模式-设计原则之开闭原则(Single Responsibility Principle)

定义

就一个类而言,应该仅有一个引起它变化的原因。简单来说,一个类中应该是一组相关性很高的函数、数据的封装。

设计模式-设计原则之开闭原则(Single Responsibility Principle)

例子

假设有一门课程,我们可以获取它的ID,课程名,课程价格

代码

首先创建一个接口

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 this.id;
    }

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

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

测试

public class Test {
    public static void main(String[] args) {
        ICourse iCourse = new JavaCourse(1, "Java", 200d);
        System.out.println(String.format("课程ID:%d\n课程名:%s\n课程价格:%f", 
                iCourse.getId(), iCourse.getName(), iCourse.getPrice()));
    }
}
           
设计模式-设计原则之开闭原则(Single Responsibility Principle)
现在有一个需求,到了特定节日需要对课程进行打折,并且不同价位不同折扣

为了不改变原有的接口和实现类,创建一个Java课程的子类

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() {
        Double originPrice = getOriginPrice();
        double disCountPrice;
        if (originPrice > 0 && originPrice < 100) {
            disCountPrice = originPrice * 0.95;
        } else if (originPrice >= 100 && originPrice < 200) {
            disCountPrice = originPrice * 0.9;
        } else {
            disCountPrice = originPrice * 0.8;
        }
        return disCountPrice;
    }
}
           

测试

public class Test {
    public static void main(String[] args) {
        ICourse iCourse = new JavaDiscountCourse(1, "Java", 200d);
        System.out.println(String.format("课程ID:%d\n课程名:%s\n课程价格:%f\n课程原始价格:%f",
                iCourse.getId(), iCourse.getName(), iCourse.getPrice(), ((JavaDiscountCourse) iCourse).getOriginPrice()));
    }
}
           
设计模式-设计原则之开闭原则(Single Responsibility Principle)

类图

设计模式-设计原则之开闭原则(Single Responsibility Principle)

继续阅读