设计模式之开闭原则示例
设计模式 示例 原则
2023-09-27 14:24:18 时间
以一个关于课程的例子展示开闭原则:
/** * 定义课程接口 */ 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; } }
综上所述,如果采用第三种,即开闭原则,以后再来个语文课程,数学课程等等的价格变动都可以采用此方案,维护性极高而且也很灵活。
相关文章
- 【java_设计模式】建造者模式
- 五种常见的 PHP 设计模式
- [置顶] head first 设计模式之----Observer pattern
- 转: IO设计模式:Reactor和Proactor对比
- Java设计模式(11)——结构型模式之享元模式(Flyweight)
- IOS委托设计模式(摘自IOS开发指南)
- 设计模式之观察者模式(Observer)详解及代码示例
- 设计模式之模板方法模式(Template Method)详解及代码示例
- 设计模式之组合模式(Composite)详解及代码示例
- 设计模式之7原则及其示例说明
- 设计模式之合成复用原则示例
- 设计模式之Future模式详解及代码示例
- 好记性不如烂笔头——23种设计模式(下)
- 设计模式面试题(总结最全面的面试题!!!)
- 实战!工作中常用到哪些设计模式
- 【 java 面向对象】java 设计模式之模板方法设计模式
- 设计模式 (二 )
- Groovy 设计模式 -- 组合模式
- 大话设计模式之原型模式