开闭原则:定义,一个软件的实体,如类、模块和函数应该对扩展开放,对修改关闭。
开闭原则的定义已经非常明确告诉我们:软件实体应该对扩展开放,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。
那什么是修改,什么是扩展。举例来说明,一个书店卖书的例子。
书籍接口整体框架
接口实现类,用构造方法获数据,提供get方法由外部获取数据
书店售书类,静态模块初始化数据,添加售书方法
运行结果
项目做完了,可是现在需求做了变更,所有的书籍都做9折处理,这个时候应该怎么修改?一般来说,有如下三种方法;
1.修改接口,在接口上新增一个getOffPrice方法,专门用于打折处理,所有实现类也要实现这个方法。这样做的后果是,实现类Novel要修改,BookStore类也要修改。否决。
2.修改实现类,直接在实现类中加入getOffPrice方法,这样做变动的只有两个了,实现类和书店类。但该方法依然不够完美。
3.通过扩展来实现变化,即增加一个子类 OffNovelBook,覆写 getPrice 方法,高层次的模块(也就是 static静态模块区)通过 OffNovelBook 类产生新的对象,完成对业务变化开发任务。——好办法,修改也少,风险也小。
实现代码如下
此时再仅需修改书店实现类的静态代码块即可
运行结果
当你不需要打折时,也只需修改静态代码块即可。且在工程中,静态代码块中的初始化数据是由持久层完成,那么可以认为,我的主业务逻辑仅仅是扩展了一个子类就完成了需求,而没有对原本的程序做任何改动。这就是开闭原则的核心概念,程序应该对修改关闭,对扩展开放。不能因为一个需求的增加就去改动原本已经实现功能的程序。
网友评论