zoukankan      html  css  js  c++  java
  • 设计模式6大原则之【开闭原则】

    定义

    一个软件实体,如类和函数应该对扩展开放,对修改关闭。是软件设计中最基础的设计原则,它指导我们如何简历稳定灵活的系统,例如我们版本更新,不修改代码可以增加新功能。实现开闭原则的核心思想是面向抽象编程而不是面向具体的实现

    优点

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

    代码案例

    有如下代码,我们有一个接口(ICourer)定义了获取id、名称、价格的方法,有实现类(Course)继承自这个接口,有一个测试方法类(Test),可以打印出信息

    ICourse接口:
    public interface ICourse {
        Integer getId();    //获取课程id
        String getName();    //获取课程名称
        Double getPrice();    //获取课程价格
    }
    
    Course类:
    public class Course  implements ICourse{
        private Integer id;
        private String name;
        private Double price;
    
        public Course(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类:
    public class Test {
        public static void main(String[] args) {
            ICourse course = new Course(1,"java入门",299d);
            System.out.println("课程id:"+course.getId()+",课程名称:"+course.getName()+",课程价格:"+course.getPrice());
        }
    }
    

    此时我们运行Test,控制台会有如下输出,没有任何问题

    课程id:1,课程名称:java入门,课程价格:299.0
    

    新需求

    我们现在要对课程进行打折活动,全场9折,或者满200打9折满300打8折等

    • 我们可以在接口中定义一个方法如 getDiscountPrice,然后实现类实现此方法。这样做不但修改了接口,而且还修改了实现类,假如实现类有很多个,那我们将修改很多个类,违反了开闭原则
    • 仅在实现类中增加 getDiscountPrice 方法。这样做就跟上面的效果一样了

    最佳方案

    新建一个课程打折类(DiscountCourse),继承自课程类(Count),并在里面定义具体的打折方法

    这种方案的优点是,我们无需修改底层的类(Course),通过新增类去新增功能,仅在上端调用的地方(Test类)做出修改,就可以实现需求。符合对修改关闭,对扩展开放的原则。
    DiscountCourse:
    public class DiscountCourse extends Course{
        public DiscountCourse(Integer id, String name, Double price) {
            super(id, name, price);
        }
        public Double getDiscountPrice(){
            //这里写打折的逻辑
            return super.getPrice() * 0.8;
        }
    } 
    
    修改Test类:
    public class Test {
        public static void main(String[] args) {
            ICourse iCourse = new DiscountCourse(1,"java入门",299d);
            DiscountCourse course = (DiscountCourse)iCourse;   //这
            System.out.println("课程id:"+course.getId()+",课程名称:"+course.getName()+",课程原价:"+course.getPrice()+",打折后价格:"+course.getDiscountPrice());
        }
    }
    

    此时运行Test,会有如下输出

    课程id:1,课程名称:java入门,课程原价:299.0,打折后价格:239.20000000000002
    
  • 相关阅读:
    查询数据库中的相同值得所有表跟字段【存储过程】
    一些常用的SQL语句
    添加网站本地映射
    ReSharper 2016.3.2 Ultimate 官方最新破解版
    C# 利用VS自带的WSDL工具生成WebService服务类
    Linux环境下docker搭建wordpress应用
    Appium环境搭建
    内联以及外联css,js文件的理解
    前端雅虎23条理解
    docker安装和使用
  • 原文地址:https://www.cnblogs.com/xiaoqingtian/p/13638078.html
Copyright © 2011-2022 走看看