zoukankan      html  css  js  c++  java
  • 设计模式之开闭原则示例

      以一个关于课程的例子展示开闭原则:

    /**
     * 定义课程接口
     */
    public interface ICourse {
        String getName();  // 获取课程名称
        Double getPrice(); // 获取课程价格
        Integer getType(); // 获取课程类型
    }
    
    /**
     * 英语课程接口实现
     */
    public class EnglishCourse implements ICourse {
    
        private String name;
        private Double price;
        private Integer type;
    
        public EnglishCourse(String name, Double price, Integer type) {
            this.name = name;
            this.price = price;
            this.type = type;
        }
    
        @Override
        public String getName() {
            return null;
        }
    
        @Override
        public Double getPrice() {
            return null;
        }
    
        @Override
        public Integer getType() {
            return null;
        }
    }
    
    // 测试
    public class Main {
        public static void main(String[] args) {
            ICourse course = new EnglishCourse("小学英语", 199D, "Mr.Zhang");
            System.out.println(
                    "课程名字:"+course.getName() + " " +
                    "课程价格:"+course.getPrice() + " " +
                    "课程作者:"+course.getAuthor()
            );
        }
    }

      项目上线,课程正常销售,但是我们产品需要做些活动来促进销售,比如:打折。那么问题来了:打折这一动作就是一个变化,而我们要做的就是拥抱变化,现在开始考虑如何解决这个问题,可以考虑下面三种方案:

      1、修改接口

      在之前的课程接口中添加一个方法 getSalePrice() 专门用来获取打折后的价格;

      如果这样修改就会产生两个问题,所以此方案否定

    • ICourse 接口不应该被经常修改,否则接口作为契约的作用就失去了
    • 并不是所有的课程都需要打折,加入还有语文课,数学课等都实现了这一接口,但是只有英语课打折,与实际业务不符
    public interface ICourse {
    
        // 获取课程名称
        String getName();
    
        // 获取课程价格
        Double getPrice();
    
        // 获取课程类型
        String getAuthor();
    
        // 新增:打折接口
        Double getSalePrice();
    }

      2、修改实现类

      在接口实现里直接修改 getPrice()方法,此方法会导致获取原价出问题;或添加获取打折的接口 getSalePrice(),这样就会导致获取价格的方法存在两个,所以这个方案也否定。

      3、通过扩展实现变化

      直接添加一个子类 SaleEnglishCourse ,重写 getPrice()方法,这个方案对源代码没有影响,符合开闭原则,所以是可执行的方案,代码如下,代码如下:

    public class SaleEnglishCourse extends EnglishCourse {
    
        public SaleEnglishCourse(String name, Double price, String author) {
            super(name, price, author);
        }
    
        @Override
        public Double getPrice() {
            return super.getPrice() * 0.85;
        }
    }

      综上所述,如果采用第三种,即开闭原则,以后再来个语文课程,数学课程等等的价格变动都可以采用此方案,维护性极高而且也很灵活。

  • 相关阅读:
    Button与ImageButton的区别
    TCP、HTTP、Socket
    ASPX开发基础
    WebForm复杂控件
    Webform 内置对象 Session对象、Application全局对象,ViewState
    JavaScript
    .net
    postman-学习笔记
    2021第一天上班,立个flag
    js函数累加
  • 原文地址:https://www.cnblogs.com/jing99/p/12574850.html
Copyright © 2011-2022 走看看