为了账号安全,请及时绑定邮箱和手机立即绑定

为你说清楚什么是设计模式

2018.08.04 14:23 2234浏览

世上有两种设计师,蹩脚的和优秀的。

  • 在蹩脚设计师的眼里,问题千变万化,无迹可寻,所以他们坚信:别逼逼,就是干。

  • 在优秀设计师的眼里,问题万变不离其宗,所以他们坚信:发现,总结,重复。

他们的战斗画面风格迥异

  • 蹩脚的设计师武功还停留在街头小混混的层次,打架没有什么招式,战斗力比较渣,所以他们习惯于以气势吓人,一言不合,撸起袖子就上,随手抓个东西就算是武器,砖头、木棒、香蕉、奶嘴、餐巾纸。。。胜之我幸,败之我命。

  • 优秀的设计师武功师出名门,一出手就是一指禅、独孤九剑、降龙十八掌等等,战斗力深不可测,所以他们习惯于随机应变,察言观色,谋而后动,蓄势待发,一击致命。“十步杀一人,千里不留行。事了拂衣去,深藏身与名。”

是不具备模式的思想是衡量一个设计师是蹩脚设计师还是优秀设计师的重要标准。

1 模式是什么

有人说:“模式就是针对特定场合下特定问题的特定解决方案。”。这话过于泛泛,按照这种定义,在厕所里拉完屎要取出手纸也应该算是一种模式。所以,别听这些外行瞎咧咧。

我认为,如果要进行简单的类比,模式大致相当于物理学或化学中的实验。

https://img1.sycdn.imooc.com/5b6545440001bc8802660272.jpg

  • 模式是可复现的,无论是问题还是解决方案。想想你们曾今做过的物理实验、化学实验等等,我不过多解释;

  • 模式是可教学的,让人可以理解、完善并传承。想想你们曾今的物理老师、化学老师等等,我不过多解释;

  • 模式是可复用的,在充分考虑了它的适用范围,边界条件等影响因素后能够快速地应用到类似的场合中从而解决问题。想想你们曾今学过的公式、定理等等,我不过多解释;

  • 模式是可命名的,让人可以轻松的交流。想想你们曾今学过的名词、术语等等,我不过多解释;

所以,模式是什么?答案就简单了。

  • 模式是一种抽象,将千万个问题归纳为一个问题,将千万个解决方法归纳为一个解决方案。

  • 模式是一种过程,经过了无数前辈发现、归纳、验证、记录。

  • 模式是一种语言,如果你还不懂那些模式名称背后所代表的具体含义,请不要自称为设计师。

那么,什么是软件设计模式?其实就是将模式细化到软件设计领域而已。

2 模式不是什么

模式是一个答案?错!

这就好比我把解一元二次方程的公式教给你了,但是要得到一个具体一元二次方程的解,你还是要算一下的。

模式是针对具体开发语言的?错!

模式是一种思想,并不针对具体的某一种语言,它可以适用于C、C++、C#、Java、Javascript、Python等等。

模式是只针对面向对象设计思想的?错!

模式并不只局限于面向对象设计思想,只不过,当四人帮写出那本软件设计模式代表作的时候,面向对象设计思想正大行其道,借着面向对象的名字听起来比较高端大气上档次而已。模式在面向过程设计思想、泛型设计思想、函数式编程设计思想等领域也是可以应用的。

模式必须工具或方法的支持?错!

尽管在讨论软件设计模式的时候我们见过了太多的UML图,但是那只是因为UML是描述面向对象设计思想的一种工具,而常见的软件设计模式又是针对面向对象设计思想的。

模式可以自动生成程序的架构?错!

架构是比模式更高一个层次的存在,一个架构里可以有很多种模式,但是架构的可复用性要远远低于模式的可复用性。否则搞软件的这份工作也就太简单了。

模式可以提供更高的生产率、保证系统的可扩展性?错!

这个是比程序架构更改层次的存在,这个很难,或许未来的人工智能可以,但至少现在还根本看不到希望。如果你非要讨论这个问题,来,还是让我们讨论一下解放台湾的问题吧。

模式是少数人装逼的东西?错!

模式的名称是为了方便设计师之间的交流,本质上是为了节省时间。如果你是老板的小舅子,所有和你沟通的时间都算是有效工作时间,可以给工资的话。来,我们可以从这个名词的读音和文字的笔画构成上讲起。

3 模式的要素

模式的四个基本要素:

模式名称

讲过了。

问题

讲过了。

解决方案

讲过了。

效果

这个需要讲一下。所有的设计一定是在某种限制下进行的,如果没有任何限制,怎么玩都是赢,那就不需要设计。所以模式也是一种权衡,必须清楚的知道模式怎样支持它的目标?使用模式的效果和所需做出的权衡取舍?系统结构的哪些方面可以独立改变?

要清楚的描述模式,可能还会涉及以下一些要素:

意图

是下列问题的简单陈述:设计模式是做什么的?它的基本原理和意图是什么?它解决的是什么样的特定设计问题?

动机

用以说明一个设计问题以及如何用模式中的类、对象来解决该问题的特定情景。该情景会帮助你理解随后对模式更抽象的描述。

适用性

什么情况下可以使用该设计模式?该模式可用来改进那些不良设计?你怎样识别这些情况?

模型

如何用UML描述设计模式?

实现

实现模式时需要知道的一些提示、技术要点及应避免的缺陷,以及是否存在某些特定于实现语言的问题?

代码示例

该模式针对具体开发语言的代码示例或代码片段。

已知应用

实际系统中发现的模式的例子。每个模式至少包括了两个不同领域的实例。

相关模式

与这个模式紧密相关的模式有哪些?其间重要的不同之处是什么?这个模式应与哪些其他模式一起使用?

4 参考资料

  • 《设计模式:可复用面向对象软件的基础》,美 Erich Gamma Richa 著

  • 《设计模式沉思录》,[美] 约翰·威利斯迪斯(John Vlissides) 著

点击查看更多内容

本文首次发布于慕课网 ,转载请注明出处,谢谢合作

1人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消