[设计模式之禅读书笔记]006_设计模式六大原则(六):开闭原则
序言
开闭是什么意思呢?显然这是两个词的合体,即开放和闭合的意思。那对什么开放呢?扩展。那有对什么闭合呢?修改。
软件开发最可怕的是什么?是变化。记得以前看过一个笑话,说一个程序员累昏倒了,在医院昏迷了好几天,家人哭的稀里哗啦的,老婆孩子在旁边怎么叫就是不醒。一天他同事来看他,第一句话就是对着躺在病床上的他说:需求又变了。奇迹发生了,那个程序员一下从病床上做起来了。
只是一个笑话而已,但是说明了变化对软件开发过程的影响,有些变化可能要修改逻辑,而有些变化甚至需要修改框架。总之,对于软件开发来说,变化是永恒不变的话题。
设计模式六大原则中的开闭原则是其他五种原则的高度概括,用作者的话来说,是精神领袖,其他五种设计原则的最终目的都是为了开闭,而研究开闭的目的就是为了能设计出沉着应对变化的软件架构。没有谁能保证自己设计的架构能在开发过程中一点不会改,也没人能保证自己设计的架构是最最有效率的。总之,一切都在实践中,我们要于实践中获取设计的真谛。
正文
要实现对开放扩展,对修改封闭,以后的23种设计模式就是我们的利器,当然,这并不是全部。可能你还在晕乎着,这开闭到底是什么意思呢?下面我们通过一个例子来说明这个问题,并用一种很简单的手段来实现扩展。
作者给我们的例子是这样一个场景:
新华书店需要一套图书销售系统,这套销售系统的功能很简单,就是把各种各样的书卖出去就可以了。
作者给了我们一套实现方案,代码是java代码,当然语言的不同并不影响我们理解设计模式。
1 // 图书接口 2 public interface IBook{ 3 public String getName(); 4 public int getPrice(); 5 public String getAuthor(); 6 } 7 8 // 小说书类 9 public class NovelBook implements IBook{ 10 private String name; 11 private int price; 12 private String author; 13 public NoelBook(String _name, int _price, String _author){ 14 this.name = _name; 15 this.price = _price; 16 this.author = _author; 17 } 18 public String getAuthor(){ 19 return this.author; 20 } 21 public String getName(){ 22 return this.name; 23 } 24 public int getPrice(){ 25 return this.price; 26 } 27 } 28 29 public class BookStore{ 30 private final static ArrayList<IBook> booklist= new ArraryList<IBook>(); 31 static{ 32 bookList.add(new NovelBook("红高粱", 3200, "莫言"); 33 bookList.add(new NovelBook("红树林", 3100, "莫言"); 34 bookList.add(new NovelBook("爆炸", 3000, "莫言"); 35 bookList.add(new NovelBook("十三步", 2900, "莫言"); 36 } 37 38 public static void main(String[] args){ 39 NumberFormat formatter = NumberFormat.getCurrencyInstance(); 40 formatter.setMaximumFractionDigits(2); 41 System.out.println("买书记录如下"); 42 for(IBook book:bookList){ 43 System.out.println("书籍名称:"+book.getName()+"\t书籍作者:"+book.getAuthor()+"\t价格:"+book.getPrice()); 44 } 45 } 46 47 }
上面的代码就相当于实现了场景,我们可以看到最后书也被卖出去了,看起来我们的书店是可以正常运营了。
不过,我们现在有个问题:
因为作家莫言获得诺贝尔奖了,为了庆祝这一喜事,新华书店决定出台莫言促销活动。所有莫言的书打八折销售。
我们有什么方案来实现打折呢?有三种
1. 修改接口,追加一个打折的方法,这样的话,NovelBook需要改,BookStore也要改。
2. 修改实现类,修改NovelBook类,追加打折方法,当然这样是不是最好的呢?想一下我们好像违背了开闭原则。
3. 扩展子类,继承NovelBook类,追加打折方法。这是符合开闭原则的,我们扩展了原来的类,而且没有修改原来的类,也就是说其他的小说书可以照样继续销售。
从上面可以看出,方案3是最佳的,这就是实现开闭的手段之一,至于修改后的代码很简单,我这里就不贴出来了。
总结
说实话,这个原则我理解的不是很透彻,只是脑子里有这个概念了,作者写了很大的篇幅来说明这个原则,但是我个人觉得都说的是一些偏项目管理方面的东西,所以,关于设计思想方面的,我也被绕糊涂了。明天就正式学习23种设计模式了,希望自己能坚持下来,一篇学一个并写一篇博客来记录自己的学习结果。