zoukankan      html  css  js  c++  java
  • 设计模式|原则—开闭原则

    开闭原则

    定义:

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

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

    优点;

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

    问题由来:

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

    解决方案:

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

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

    代码演示:

    有一个接口:

    • 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());
        }
    }
    

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

  • 相关阅读:
    修改Anaconda中Jupyter Notebook默认工作路径
    npm卸载和安装淘宝镜像原
    hash和history两种模式的区别
    威胁建模之WEB应用自动化截图
    Ubuntu系统清理
    Ubuntu环境的docker实践——ONOS
    BUUCTF-crypto:信息化时代的步伐
    BUUCTF-crypto:四面八方
    BUUCTF-crypto:[HDCTF2019]basic rsa
    BUUCTF-crypto:rsarsa
  • 原文地址:https://www.cnblogs.com/jlutiger/p/11425077.html
Copyright © 2011-2022 走看看