设计模式,这种东西大佬也说了一言难尽。 维基百科对设计模式定义为:
在软件工程中,设计模式(Design Pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽马等人提出的。设计模式并不是直接用来完成代码的编写,而是描述在各种不同的情况下,要怎么解决问题的一种解决方案。
设计模式一般认为有23种,这23种设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的总结应用。
其实框架已经在使用 单例模式、发布订阅模式、原型模式等,只是你不读源码的话根本就发现不了。
既然是一套理论,是一种约定和规范,那么设计模式也就有自己的模式原则。总体来说,其六大原则包括:
1.开闭原则
2.里氏替换原则
3.依赖反转原则
4.接口隔离原则
5.最小知道原则
6.合成复用原则
第一,开闭原则,就是要了解开和闭。这里的开是指对扩展开放,闭是说对修改关闭。想想我们有一套实现,提供一个服务,这样的程序需要能够随时进行扩展、随时支持第三方的自定义配置,但是不能去修改已用的实现代码。
比如我们做了一个UI 组件的轮子,业务方面在使用的时,显然不能修改我们的呃代码,但是仍然可以进行扩展。再比如著名的Draft.js库,在实现一个编辑器的时,提供了灵活的插件机制,实现热插拔的效果,使得整个程序的扩展性好,易于维护和升级。甚至Redux 库、Koa库等基本所有库都有开闭原则的体现。
对于面向对象类型的语言来书,想要严格遵循开闭原则,往往需要使用接口 和 抽象类,这个我们会在具体设计中国再次提到。
里氏替换原则(Liskov Substitution Principle)
里氏代换原则就扫尾有些抽象,但它是面向对象设计的基本原则之一。
里氏代换原则要求,任何基类可以发挥作用的地方,子类一定可以发挥作用。
这句话怎么说?想想我们的继承实现,里氏替换原则就是继承复用的基础。只有当派生类可以随时替换掉其基类,同时功能不被破坏,基类的方法仍然能被使用,这才是真正的继承,继承才能真正地实现复用,当然,派生类也需要随时能够在基类的基础上增加新的行为。
事实上,里氏代换原则是对开闭原则的补充。
依赖反转原则(Dependence Inversion Principle)
该原则要求针对接口编程,依赖于抽象
接口隔离原则(Interface Segregation Principle)
接口隔离的意思或者目的是减少耦合的出现。在大型软件架构中,使用多个相互隔离的接口,一定比使用单个大而全的接口要好。
最少知道原则,又称迪米特法则(Demeter Principle)
是指:一个系统的功能模块应该最大限度地不知晓其他模块的出现,减少感知,模块应相对独立
合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成 / 聚合的方式,而不是使用继承。这是很有意思的一个点,我们在之前的课程中提到过:基于原型的继承在很多程度上“优于”基于类的继承,原因就在于基于原型的继承模式提现了可组合性,能够规避“大猩猩和香蕉”等问题的出现。组合是非常优秀的编程思想,这一点在函数式编程范畴中得到了最大程度的印证。
设计模式在总体上归为三大类:
1.创建型
2.结构型
3.行为型
对于java来说,它还包括了 J2EE 类型的设计模式。
我们分别来看:
创建型(Creational Patterns)
创建型的五种设计模式提供了更加灵活的创建方式,同时可以隐藏创建的具体逻辑。与直接使用 new 运算符实例化对象相比,这些模式具有更强的灵活性和定制性。

这是创建型的5中模式
结构型(Structural Patterns)
结构型的七种设计模式关注类和对象的组合,结合继承的概念,这些设计模式能使得对象具有更加灵活的功能设定。

行为型(Behavioral Patterns)
行为型的十一种设计模式聚焦于对象和类之间的通信,这是构建大型工程的必不可少的环节

关于设计模式的学习
设计模式使代码编写真正工程化,我们说设计模式是软件工程的基石脉络,如同大厦的结构一样。没有必要刻意地学习设计模式,因为有关设计模式的思想一定是在实际工程开发中慢慢体会总结的。但是这需要开发者做到“非常有心”,才能够自己去慢慢积累,为了能够培养这种“用心”, 读者去专门了解设计模式似乎也是一种捷径和方式
文章采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接。