初衷
对于程序员来说,设计模式并不新鲜。网上、书店可以找到各种设计模式的资料。很多的公司招聘技术人员都把它作为一个衡量标准。自己最近阅读了n本设计模式相关的书籍、也查找了一些网上的资料,在与同事的交流中,体会较深。打算写一系列的博客来分享自己的技术体会和心得。
本系列博客的重心:
- 实例讲解,对每个案例都会从面向实现编程和面向设计编程两个角度来分析设计模式的优势。
- 以用为主。
- 编码。talk is cheep,show me your code.
学习设计模式的目的
学习设计模式的目的,是为了更好的设计系统。系统之所以需要设计,是因为系统要慢慢变化,有需求变更,有产品升级,系统慢慢变得大了,维护的人员多了,就需要各种规则约束。那么如何去应对这种大、人多、业务复杂、变化多样的系统呢?答案就是更好的设计。那么,该如何设计系统呢?有没有一些指导?——大难就是设计原则。我们在设计系统时候,都是以设计原则为指导的。你知道设计模式,不知道设计原则,白搭。但是设计原则过于抽象,可以通过学习设计模式来理解设计原则。
我们在做系统设计时候,会在设计过程中遇到各种各样的问题。有些问题久而久之,遇到的多了,就形成了一些固定的解决思路,而这些解决思路,就是设计模式。如果用这一条线来理解设计模式,一点儿都不难。即:设计过程 -> 遇到了问题 -> 总结典型问题 -> 总结解决办法 -> 归纳出23种设计模式。
因此,设计模式一般包括模式名称、问题、目的、解决方案、效果等组成要素,其中关键要素是模式名称、问题、解决方案和效果。问题:在哪种场合和问题环境下使用这个模式。解决方案:包括UML类图和核心代码描述。效果:该模式的优缺点及需要权衡的问题。以下在分析23个设计模式时也会按照这个流程来全面的分析每个设计模式。
如何提升自己的设计水平
设计模式是面对一个需求,或模拟一个需求,反复推翻,反复实践后的结果,在这个过程中,会对他理解的越来越深刻。
少说多用。“如果想体验一下运用模式的感觉,那么最好的方法就是运用它们”
学习设计模式的四重境界:
第一阶段:手中无剑,心中无剑
初步掌握一门面向对象编程语言,了解了类、对象、接口等概念。听别人说到“设计模式”感觉特别高大上,自己不太懂,也用不太起来。
第二阶段:手中有剑,心中无剑
既然不太懂,那就学呗。四人帮经典23式开始一招一招比划。但此时手中虽有了重剑,却不太能舞起来。如果说某人第一次看《设计模式》,就看得通透的话,那我真是佩服得五体投地。
主要原因是,刚开始学习设计模式的人,开发经验一般相对较少,此时我们还缺乏实际经历的应用场景去做参考,看着书中的例子很难感同身受,比如我们看到“封装XX变化性”之类的描述很难引起共鸣。而且很有可能模式的描述和场景压根就不太明白。
但是没关系,此时我们也能像模像样喊出几个招式了,也基本有个感性认识,虽然实际工作中还不太有感觉。
第三阶段:手中有剑,心中有剑
随着自己的学习和开发经历的丰富,你已经对设计模式有一定理解了。在阅读开源代码,或者身边高手的代码时,你经常可以发现可以对应于某模式,因为类命名会出现设计模式中的术语,Factory, Builder,Strategy等。你逐渐明白了某个模式用在某个地方能起到什么作用,你经常会有一种”Wow”的赶脚。
这时你在编程过程中,能够照猫画虎的用设计模式了。而且你开始学习面向对象设计原则,比如SOLID原则也有了一定的理解。你跟别人讨论时,可以大声地说:让我们使用一个XX模式来支持更好的扩展性吧。你时不时会回头去《设计模式》,除了能够提供参考,此时你会有一些新的体会了。
第四阶段:手中无剑,心中有剑
你已经有设计和架构的概念了,这时你已经开始面对一个几万行甚至几十万行的项目,有一天你发现代码已经很难快速响应需求变化了,又没办法推倒重来(虽然推倒重来是码农最爱),所以来重构吧,重构的过程中,一个个设计模式把代码维护中的一个个痛点逐个击破,你对代码的“smell”有了更深刻的理解,你开始对copy-paste代码深恶痛绝,你发现原来重构和设计模式竟然是孪生兄弟。
你开始明白一个长期维护和演化的项目,设计如此之重要。你不自觉地就会主动去翻《重构》、《浮现式设计》、《领域驱动设计》、Bob大叔的《敏捷软件开发》、《企业应用架构模式》等等,虽然你之前可能看过,但此时你看他们的心境和底蕴已经不一样了,你会发现这帮家伙确实很会总结。
最终,你回本溯源,你还是拿起了当初那本《设计模式》,你终于深深地体会到了里面闪烁的智慧,“面向接口编程”,“组合优先继承”,多么朴素的文字,或许很多人都能说出来,但是你确定你现在的理解更加深刻了。
你会发现,此时你手中已经无剑了,你不会想着什么模式列表了,不会想着某个模式重要了。进行一个复杂设计时,不自觉地就从软件开发的终极目标“高内聚低耦合”出发,“面向接口编程”,“组合优先继承”,“创建与使用分离”等认知成为体液反应,结合需求场景,每定义下一个类都有“开放封闭”等各种面向对象设计原则护体,随着项目演进,你能敏锐地嗅到各种代码smell,知道如何考虑现有资源去减少该死的技术债,随时进行着重构。
感觉自己到了第三阶段了。还有很长的路要走。
目录
每一个设计模式都为某一类可重复的设计问题提供了一套解决方案。根据他们的用途,设计模式可分为创建型、结构型和行为型模式3种。其中,创建型模式主要用于描述如何创建对象,结构型模式主要用于描述如何实现类和对象的组合,行为型模式主要用于描述类和对象怎么交互以及怎么分配职责。此外,根据某个模式到底是处理类之间的关系还是主要用于处理对象之间的关系,设计模式又可以分为类模式和对象模式。
前言
一.设计原则
1. 单一职责原则
2. 开闭原则
3. 里氏替换原则
4. 依赖倒置原则
5. 接口隔离原则
6. 迪米特法则
7. 合成复用原则
二.创建型模式
1. 单例模式
2. 工厂方法模式(包括:简单工厂模式)
3. 抽象工厂模式
4. 原型模式
5. 建造者模式
三.结构型模式
1. 适配器模式
2. 桥接模式
3. 组合模式
4. 装饰模式
5. 外观模式
6. 享元模式
7. 代理模式
四.行为型模式
1. 职责链模式
2. 命令模式
3. 解释器模式
4. 迭代器模式
5. 中介者模式
6. 备忘录模式
7. 观察者模式
8. 状态模式
9. 策略模式
10. 模板方法模式
11. 访问者模式
总结
说明
技术成长之路,急不得,要多去积累相关的经验,多做推敲和沉淀总结,凡伟大皆始于细微,问题是有人持续去做,有人很快就放弃了。
这个世界上可以挣钱的行业有很多,如果不是喜爱编程,热爱编程,恐怕终不会耐得住寂寞,成为自己所在行业的顶端的程序员。所以,请爱上编程,爱上编码的感觉.如果可以通过自己的技术来改变人们的生活,岂不是人生中最美好的事情。