[设计模式之禅读书笔记]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种设计模式了,希望自己能坚持下来,一篇学一个并写一篇博客来记录自己的学习结果。

posted @ 2012-10-27 00:54  邵贤军  阅读(1563)  评论(5编辑  收藏  举报