设计模式(一)——认识设计模式

前言

一直想写设计模式系列的博客,但是一直下不了决心去写。一方面是自己刚开始工作,有时候腾不出那么多时间学习,另一方面是因为看了网上好多设计模式的文章,感觉他们总结的都很到位,自己再写也写不太好。但最后还是决定写一下,因为知识只有自己梳理一遍才记得牢固,不管写的好不好都是自己的。

这个系列我打算以初学者的身份一点一点去挖掘每一个设计模式,用宇明大佬教的《费曼学习法》用讲解的语气去写每一篇文章。ok,言归正传,我们开始今天的文章——设计模式(一)设计模式概述

在看到标题的时候,我想作为一个初学者应该会先提出这些问题:

  1. 什么是模式?什么是设计模式?
  2. 我们为什么要学习设计模式?设计模式对我们开发有什么帮助?
  3. 我们如何学习设计模式?

接下来我们就带着这些问题来学习今天的内容。

一、什么是模式?什么又是设计模式?

什么是模式?我们先从字面意思来理解,“?!蹦P汀⒛>?,我们可以看做是一种标准,“式”形式、方式,我们可以看做是一种方法,两者组合在一起就是“标准化的方法”叫做模式。

举个很恰当了例子:中国的四大发明之一,活字印刷术的诞生过程就是一种模式的产生。在没有活字印刷术之前,每页文字刻成一个板子,如果一个字错了就得重新雕刻,错误率很高,成本也高,效率还低。之后演变成为每个字为单独小板,印刷文章的时候只需要在大板子上根据需求排列不同的字就可以了,这些字不仅雕刻起来错误率低,还可以重复不同的文章使用。这是一种标准化方法的演变过程,也是一种模式的诞生。

每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次地重用那些已有的成功的解决方案,无须再重复相同的工作。简而言之就是:模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。

上面我们了解了模式,但有的朋友该说了,我们是软件开发工作者,知道模式有什么用呢?别着急,下面我们就来认识一下软件模式。

软件模式,如果按刚才我们理解的“模式”,软件模式就可以解读为:软件生命周期内的一些标准化方法。我们知道软件的生命周期并不单单只开发周期,软件前期的需求分析,后期的迭代维护都属于软件的生命周期,所以相对应的在每个阶段都会有对应的模式。作为开发者我们接触最多的就是开发阶段,而在开发阶段使用最多的应该就是设计模式了。那什么又是设计模式呢?

据网上搜索得知:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。其实说白了,设计模式就是经过无数填坑人的努力所总结的一套标准化的被所有开发者承认的代码设计方案。

设计模式一般包含模式名称、问题、目的、解决方案、效果等组成要素,其中关键要素是模式名称、问题、解决方案和效果。

模式名称(Pattern Name)通过一两个词来描述模式的问题、解决方案和效果,以便更好地理解模式并方便开发人员之间的交流,绝大多数模式都是根据其功能或模式结构来命名的;

问题(Problem)描述了应该在何时使用模式,它包含了设计中存在的问题以及问题存在的原因;

解决方案(Solution)描述了一个设计模式的组成成分,以及这些组成成分之间的相互关系,各自的职责和协作方式,通常解决方案通过UML类图和核心代码来进行描述;

效果(Consequences)描述了模式的优缺点以及在使用模式时应权衡的问题。

个人感觉这些已经很全面的解释了什么是设计模式,之后我也打算从这四个方面去分析每一种模式。

二、设计模式是为了解决什么样的问题?我们为什么要学习设计模式?

认识完设计模式我们肯定会产生以下疑问?我们为什么要学习设计模式?它在我们开发当中都解决了哪些问题?

通过学习我觉得学习设计模式可以解决以下三个问题:

1、避免重复造轮子

学习计算机我们肯定都听过这句话“不要重复造轮子”,设计模式首先解决的就是我们重复造轮子的问题。

举个栗子:在没有学习设计模式的时候,我们使用图片加载或者其他工具类,肯定是经过大量的编程,走过很多弯路,填过很多坑才会想到“我们应该封装一下,单独一个实例这样更加便于管理”,于是我们开始封装,废了好大劲封装成功,之后学习完 “单例模式”发现,咦,这不就是我封装的那个方式么?如果早学了设计模式,我就。。。。所以,在时间就是金钱的今天,设计模式无疑会为有助于我们提高开发和设计效率,但它不保证一定会提高。

2、降低沟通成本

工作中我们不可能是一直独立开发,肯定会跟别人协调开发。只要有合作就少不了沟通,设计模式也能解决开发人员之间的沟通问题。

再举个栗子:你从零开发了一个项目,后来项目越做越大,功能模块也越来越多,多到你天天加班也弄不完的情况,这个时候你向老板提出“涨工资不然不干了,然后老板开始给你各种画饼。。?!保ǔ对读耍馐焙蚰阆蚶习逄岢鲂枰桓霭锸?,然后老板给你招来一个小弟,你需要带他熟悉项目,你对他说我这个地方用了“单例模式”,这里用了“装饰者模式”,然后这里是“工厂模式”,然后小弟懵逼了。然后你还得费好大劲去讲解你是怎么实现的这些模式。。。很显然小弟并不了解设计模式,不然你就可以省下很多时间多写几个bug了。

因为设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流,使得设计方案更加通俗易懂,所以无论你使用哪种编程语言,做什么类型的项目,甚至你处于一个国际化的开发团队,当面对同一个设计模式时,你和别人的理解并无二异,因为设计模式是跨语言、跨平台、跨应用、跨国界的。

3、优秀的复用性和可扩展性

上大学的时候我们学过,一个优秀的软件需要有六大特性:功能性、可靠性、可用性、效率、可维护性、可移植性。然而很多开发人员在开发的时候多半不会考虑这些东西。因为国内的开发环境大多是先出结果,出问题了再说。

所以,如何在有限的时间内开发出优秀的软件是成为优秀开发人员的必修之路。大部分设计模式都兼顾了系统的可重用性和可扩展性。例如:代码中经常使用某个功能,我们可以使用“单例模式”把他封装起来,如果考虑某个地方的可扩展性,我们可以使用“装饰模式”等等。

三、常用的设计模式都有哪些?

经过无数前辈的总结,常用的设计模式主要有23种,而这23种设计模式又可以分为三大类:创建型模式(5种)、结构型模式(7种)和行为型模式(11种)。

其中创建型模式主要用于描述如何创建对象,结构型模式主要用于描述如何实现类或对象的组合,行为型模式主要用于描述类或对象怎样交互以及怎样分配职责。下图是23种模式的具体分类:

创建型模式 Creational Pattern
单例模式 Singleton
原型模式 Prototype Pattern
简单工厂模式 Simple Factory Pattern
工厂方法模式 Factory Method Pattern
抽象工厂模式 Abstract Factory Pattern
建造者模式 Builder Pattern
结构型模式 Structural Pattern
适配器模式 Adapter Pattern
桥接模式 Bridge Pattern
组合模式 Composite Pattern
装饰模式 Decorator Pattern
外观模式 Fa?ade Pattern
享元模式 Flyweight Pattern
代理模式 Proxy Pattern
行为型模式 Behavioral Pattern
职责链模式 Chain of Responsibility Pattern
命令模式 Command Pattern
解释器模式 Interpreter Pattern
迭代器模式 Iterator Pattern
中介者模式 Mediator Pattern
备忘录模式 Memento Pattern
观察者模式 Observer Pattern
状态模式 State Pattern
策略模式 Strategy Pattern
模板方法模式 Template Method Pattern
访问者模式 Visitor

注:之后每学习一个模式,我们会在表格后面增加模式的概述,使用场景等内容

四、我们如何学习设计模式?

我从大学开始接触设计模式,虽然是门选修课,但它是我唯一 一门没有逃过一节课的选修课。毕业后我也从事了近两年的开发工作。在这期间我体会到了设计模式的种种便利,也了解一些朋友对设计模式的看法。在这里我想分享一下自己学习设计模式的心得体会,供大家参考:

1、不要畏惧。工作期间我跟很多同事谈论过设计模式,他们大多数的反应是“那个感觉挺难的,现在没打算去学?!焙芏嗳嘶姑豢季鸵丫怂趿?。其实掌握设计模式并不是很难的事情,我们只需要拆分他们,一个一个模式去熟悉,一个例子一个例子去看、去模仿,多思考,多实践,一定可以掌握。关键是要开始去学。

2、抓住重点。其实学习每一个设计模式只需要抓住以下几点,我们就能大概掌握这种模式。

  1. 这个设计模式是要解决什么问题,需要在那种情况下使用?
  2. 这个设计模式的结构图是什么样的?
  3. 这个设计模式的优缺点分别是什么?
  4. 在现实和代码中分别能举出什么样的使用该模式的例子?

3、亲身实践。老话说:“纸上得来终觉浅,绝知此事要躬行”,看十遍例子也不如敲一遍代码,一定要把例子敲一遍,并且举一反三自己设计例子。这样才能记得牢固。

4、不能滥用。千万不要滥用模式,不要刚学了一两个模式就想在代码中硬套。每个模式都有自己的适用场景,不能为了使用模式而使用模式。要做到具体情况具体分析,滥用设计模式很可能写出一堆垃圾代码。

5、活学活用。我这里直接用刘伟老师的总结来解释。

设计模式的“上乘”境界:“手中无模式,心中有模式”。模式使用的最高境界是你已经不知道具体某个设计模式的定义和结构了,但你会灵活自如地选择一种设计方案【其实就是某个设计模式】来解决某个问题,设计模式已经成为你开发技能的一部分,能够手到擒来,“内功”与“招式”已浑然一体,要达到这个境界并不是看完某本书或者开发一两个项目就能够实现的,它需要不断沉淀与积累,所以,对模式的学习不要急于求成,要循序渐进。

设计模式目录

设计模式(一)—— 认识设计模式
设计模式(二)—— 技术直男正确“面向对象”的六大原则
设计模式(三)—— 单例模式
设计模式(四)—— 原型模式
设计模式(五)—— 简单工厂模式

五、结语

最后用软件工程大师之一John Vlissides的著作《设计模式沉思录》(Pattern Hatching Design Patterns Applied)中的一句话来结束这篇文章:
模式从不保证任何东西,它不能保证你一定能够做出可复用的软件,提高你的生产率,更不能保证世界和平。模式并不能替代人来完成软件系统的创造,它们只不过会给那些缺乏经验但却具备才能和创造力的人带来希望。

本文参考:
《设计模式——可复用面向对象软件的基础》
《Head First设计模式》
《大话设计模式》
【刘伟 http://blog.csdn.net/lovelion

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,943评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,975评论 3 119
  • 听到羊驼和雨洛唱的喂喂歌,哦不歌名不叫喂喂,叫干物女。因为歌词里有好几个喂喂,我脑子里就一直是喂喂喂喂.........
    轻水阅读 746评论 0 0
  • 注:本文章的内容仅适合维秘超模审美和软妹子形体训练,不倡导肌肉女审美和粗腰粗腿训练,男生和喜欢练粗腰腿的女侠请绕道...
    健身客阅读 9,711评论 13 57
  • 图文/无为跑者 低头凝神飙全马, 路边摇摆狗尾巴。 尔抵风霜抗雪雨, 我翻陡坡越坑洼。
    最家游阅读 674评论 24 34