在进入具体的设计模式之前,我们有必要知道,设计模式是什么?为什么要学习设计模式?怎么学习设计模式?只有了解了这些问题之后,我们学起来才会“不忘初心”,如果为了设计模式而学设计模式,有可能到最后也是一知半解,无法体会它的奥妙之处。
一、设计模式是什么?
我们先看下设计模式的定义,百度百科中是这样描述的:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。设计模式代表了最佳的实践,是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
通俗一点的理解,设计模式就是经验复用,在遇到相似的问题,避免重复造轮子。
二、为什么要学习设计模式?
这个问题的答案在设计模式的定义中已经可以知道了,就是最佳实践的复用。那自然而然我们要问的是什么是最佳实践?经过不断的摸索,总结跟归纳,渐渐的形成了一套评判的标准。这就是众所周知的六大原则。
1.开闭原则(Open-Close Principle(OCP)):一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。目的就是保证程序的扩展性好,易于维护和升级。
2.单一职责原则(Single-Responsibilitiy Principle(SRP)):对一个类而言,应该仅有一个引起它变化的原因。如果存在多于一个动机去改变一个类,那么这个类就具有多于一个的职责,就应该把多余的职责分离出去,再去创建一些类来完成每一个职责。
3.接口隔离原则(Interface Segregation Principle):用于恰当的划分角色和接口,具有两种含义:1、用户不应该依赖它不需要的借口。2、类间的依赖关系应该建立在最小的接口上。其思想跟单一职责是一样的。
4.里氏代换原则(Liskov Substitution Principle):子类可以扩展父类的功能,但是不能改变父类原有的功能。
5.依赖倒置原则(Dependence Inversion Principle(DIP):程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
6.迪米特原则(Law of Demeter):最小知识原则,一个对象应该对其他对象有最少的了解。通俗来说就是,一个类对自己需要耦合或者调用的类知道的最少。其核心观念是:类间解耦,弱耦合。
当然,后面也有其他人提出了第七大原则:
7.合成/聚合复用原则:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象通过向这些对象的委派达到复用已有功能的目的。它的设计原则是:要尽量使用合成/聚合,不要使用继承。
设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。
小知识:模式起源于建筑业而非软件业,Alexander给出了关于模式的经典定义:A pattern is a solution to a problem in a context。即模式是在特定环境中解决问题的一种方案。
《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为"四人组(Gang of Four)",而这本书也就被称为"四人组(或 GoF)"书。
三、怎么学习设计模式?
如何学习设计模式,这个问题没有标准答案。很多人一般都是看各种书籍,博客,视频学习,或是自己写一些小例子,工作中尝试去用一些设计模式,或是向别人请教等等。总之条条大路通罗马,学习的方法也是有很多种,大家只要找到自己适合的学习方法就可以。这里,我也给出点建议,仅供参考。
1.掌握设计模式的语言UML,即统一建模语言。没有语言的交流会是什么样的,恐怕已经无须多言。如果一个人大谈特谈设计模式,但却连最基本的UML都不清楚,恐怕也不会让人信服吧。
2.学以致用,理论与实际相结合。理论上,《HeadFirst Design pattern》、《大话设计模式》都是一些比较经典的书籍,此外韩顺平老师的《尚硅谷韩顺平Java设计模式》也是十分不错的视频资源,强力推荐。实际上设计模式早已应用到各种各样的框架中。无论是jdk的输入输出流的装饰模式还是spring中的工厂模式......这样的例子数不胜数。
学与用犹如自行车的两个轮子,无论少了哪一个,就不叫自行车了。
3.待补充.......
了解了设计模式的前世今生之后,下一章,我们将一起学习设计模式的语言,也就是大名鼎鼎的UML语言。