设计模式开篇
首先应该对要讨论的设计模式主题进行约束,是面向对象编程的设计模式,针对于非面向对象编程,如函数式编程、过程式编程,也有相应的设计模式。
明确了是面向对象编程,那么所有的设计套路都是基于面向对象编程的特性,封装、抽象、继承、多态四大特性就是设计模式的基础,各种模式都是利用了这些基础能力来巧妙设计的,如果没有编程语言自身的能力支持,就谈不上设计模式了。
因此,这四大特性应该真正做到理解,而非死记硬背,理解之后,后续讲到每一种设计思路时,才会有清晰的脉络,模式不是被突发的设计出来的,而是经过经验演进而来。
封装,将同一类的属性、方法统一装在一个类中,强调聚类效果。
抽象,在具体类别上再设计一层,能够更高的抽象,定义通用的接口或抽象类,隐藏具体的实现细节,提供更通用的视图。
继承,通过类的层次化结构实现代码复用,子类可以扩展或修改父类的行为,减少代码重复。
多态,通过父类的接口调用子类的具体实现,使得代码能够以一种通用的方式处理不同的对象,提高代码的通用性和灵活性。
这些特性共同构成了面向对象编程的核心,是设计模式的基石。

上图中,可以看到是整个设计模式的一个最小结构,其他的模式都是在此基础之上,进行变化,只是各个模式的目的不同,记住这句话,目的不同,目的不同,因此在学习设计模式时,明确了每个模式的目的是什么,是为了解决什么问题,就能够很自然的实际使用中应用上了。而不是死记硬背,到最后发现各个模式的图都很相似,一头雾水。
这四大特性,是整个设计模式的基石,如果开发语言本身没有提供继承能力,没有接口能力,那么面向对象的设计模式就不存在了。
技术的本质是组合与递归,先要清楚最小的原子工具是什么,上层能力都是基于原子能力逐步堆叠上来的。
说完了最基础的基石特性,再来看看设计模式有那么原则,这些原则是前辈们在过往项目中沉淀下来的宝贵经验。
- 封装变化:将系统中易变的部分独立封装,避免代码的重复修改。
- 针对接口编程,而非实现:通过接口定义行为,使代码依赖抽象而非具体类,提高灵活性。
- 多用组合,少用继承:通过对象组合实现功能复用,避免继承导致的类爆炸和僵化。
- 为交互对象松耦合设计:减少对象间的直接依赖,使系统更灵活、易于扩展。
- 开发-关闭:类应对扩展开放,对修改关闭。通过组合和装饰动态添加功能。
- 依赖倒置:高层模块不应依赖低层模块,二者都应依赖抽象。
- 最少知识:对象应尽量减少与其他对象的交互,只与“朋友”通信。
- 模式应用:外观模式封装子系统接口,简化客户端调用。
- 好莱坞原则:高层组件控制流程,低层组件被动响应(“别调用我们,我们会调用你”)。
- 单一职责:一个类应只有一个引起变化的原因。
太多了不好记忆吧,那就记忆一个简化版,SOLID原则,分别是哪五个单词的首字母,自行查询吧。
其实不需要死记,只要清楚一点,整个设计模式都是在解决一个问题:在需求有修改变动时,能够不对之前的逻辑代码尽量不改动,只做扩展即可,将影响范围降至最小。
将变动封装、共性抽象、职责清晰化、依赖最小化,做到后续改动的扩展性,保证已完成的代码少改动,有了这个想法,不经意间,非刻意使用设计模式时,也会写成经典的模式代码。
最后,为什么要学习设计模式呢,一是为了自己实现时能够参考过去好的经验,二是不学习设计模式,别人的代码你看不懂。还记得当初使用和阅读java io库时,多个new连接在一起,是多么的疑惑。