设计模式读书笔记:绪

绪:

大体看了一下《大话设计模式》和《Head First 设计模式》先写写感想,然后以此为开篇写读书笔记。

为什么要有设计模式?

其实,最主要的原因便是,对于软件来说,需求是会一直变化的,扩展功能,增加逻辑等,都会导致我们再次编辑原本写好的代码。但是只要有点编程经验的人都会知道,哪怕是自己写的代码,过一段时间,依然会想不起来或者看不懂具体的逻辑是什么,这样导致问题便是要是修改原本的代码,可能会因为和原本的逻辑不通而导致原本正常运行的功能出现异常。

于是人们提出,应该面向扩展,关闭修改,什么意思呢?也就是说如果写的代码可扩展,那么在下次出现修改扩展/添加功能的时候,就不用修改以前的代码,只用增加新的逻辑即可。

这便是设计模式的核心:开闭原则(OCP):Open Closed Principle

其实开闭原则在生活中也能找到,比如《大话设计模式》里面提到的曹操作诗的故事,正是活字印刷术达到了灵活,可扩展,因此才被评为中国四大发明之一。

设计模式有什么用?

既然开闭原则这么重要,那么怎么才能遵循开闭原则呢?前人通过无数的经验教训总结了其他许多的原则用来达到开闭原则,最重要的便是SOILD原则

S:SRP(Single Responsibility Principle),单一职责原则,只有遵循单一职责原则,才能在需要扩展功能,修改功能的时候不影响其他的类。

O:OCP(Open Closed Principle),开闭原则,作为面向对象设计中可复用的基石,是面向对象设计中最重要的原则之一。

I:ISP(interface-segregation principles),接口隔离原则,此原则的主要目的是使系统低耦合,从而让系统更容易重构,修改等。

L:LSP(Liskov Substitution principle),里斯替换原则,实现开闭原则的基础

D:DIP(Dependency inversion principle),依赖倒转原则,同样主要目的使系统解耦,遵循此原则可以使系统更加灵活,更加容易重构。

还有其他两个比较常提的有:

最少知道原则,又叫迪米特原则,该原则同样是降低系统的耦合性,使得系统的间的逻辑更加简单

组合优于继承原则,该原则主要降低系统的耦合性,使得某个类被修改的时候,不会影响到其他的类

可以看出来,开闭原则是主要目的,而里斯替换原则是实现开闭原则的基础,其他原则主要目的就是降低系统的耦合性,使得系统更加灵活。

使用设计模式来遵循设计原则

说了这么多,那设计模式和这些原则有什么关联呢?

可以看到,上面的原则说起来比较容易,但是在实际的开发中,你会发现如果结合各种业务逻辑,你会发现难以遵守各种原则,而设计模式便是前人总结出来用于各个情况下,应该如何设计才能遵守各个原则的一种框架。

比如在平时的代码中,我们可能会写一堆if-else来判断各种情况下应该执行的代码。但是随着系统越来越庞大,逻辑越来越复杂,在扩展时可能稍微不注意就改了其他原本正确的代码,这个时候我们就可以使用责任链模式或者状态模式重构这段代码,使得系统在扩展的时候不会影响到其他的代码。

设计模式—框架代名词

设计模式还有个好处就在于使用模式能够成为一种设计方式的代名词,比如在重构/编写代码的时候,我们可能会觉得这里使用责任链模式比较好,因此我们会按照传统的责任链模式重构系统,这样当另外一个学过设计模式的人看到这个代码的时候,只用看个大概就能瞬间明白整个流程。就好像我们把使用面粉和上发酵粉加水烘烤半个小时所产生的食物叫做面包一样,一提到面包,你就能想到它的样子。

正确使用设计模式

在《大话设计模式》和《Head First 设计模式》两本书中,都提到了过度设计这个词。设计模式也是有的副作用的,大多设计模式为了在修改时不修改其他代码,都是通过里斯替换原则来面向接口设计一个功能,这样带来的问题就是系统中类过多。设计模式的副作用还有其他的,因此如果我们在编写代码得时候,如果能够预测需求的变化,可以预先进行简单的设计,如果无法预测未来变化,可以等需要重构的时候在使用设计模式。

但是在编写代码的时候,可以尽量遵循设计原则,即使不使用设计模式,代码的灵活性依然会很高。