65.9K
CodeProject 正在变化。 阅读更多。
Home

设计模式概述 - 初学者指南

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (16投票s)

2010年11月16日

CPOL

8分钟阅读

viewsIcon

69732

对设计模式、相关术语和概念进行详细概述。讨论什么是设计模式,它们为什么重要等等。

引言

如果您已经为大小产品或软件应用程序编写过程序,那么您很可能已经使用过许多设计模式……尽管它们可能不是最常用/标准的设计模式之一。

但是,实现设计模式和“使用”设计模式之间确实存在明显的区别……无论哪种方式,处理设计模式的人都理解它,或者会很容易理解它。

重点是,设计模式对程序员来说并不陌生。

在本文中,我将尝试从基础开始解释设计模式,并在另一篇文章中详细研究各种模式、示例等。

什么是设计模式?

开始

我认为开始理解设计模式的最佳方式是理解我们在日常生活中或多或少遵循的非技术性模式。

例如,我们来看看提交给职位空缺的许多简历。每个人的简历看起来都不一样……尽管它们都旨在做同一件事,即告诉读者他们的技能是什么,或者他们如何适合这份工作。

大多数提交工作申请的人都知道,他们需要提交一份包含特定信息的、格式化的 Word 文档简历。

这……是一种模式,每个人提交的简历都包含其中表达的特定信息。

如果您觉得……可以称之为模板而不是模式。设计模板。

现实生活中有很多这样的模式。有些人喜欢下面的例子

全球所有厨师都以同样的方式制作披萨或炸薯条。尽管他们可能会添加不同的配料/调味。这是一种模式。

每辆汽车的设计都遵循基本的设计模式:四个轮子、方向盘、核心驱动系统,如油门-刹车-离合器等。

所有重复建造/生产的东西,其设计都必然遵循一种模式……无论是汽车、披萨、自动取款机,还是……甚至牙刷。

在软件中,某些逻辑/机制/技术的编码方式已经几乎成为标准,因此被称为——并因此被研究为——软件设计模式。

为什么设计模式很重要?

基本上有两个原因

  1. 遵循标准
  2. 加快开发

我将详细解释。

首先,我们来看看为什么遵循标准模式很有意义。

让我们再次以之前讨论过的简历列表为例。

可能有一两个申请人通过纯文本邮件发送求职申请,没有适当的格式,也没有附加文件等……这一个或两个申请人没有遵循模式……并且不太可能得到这份工作……*为什么?*因为他们偏离了已建立的模式,而招聘人员可能不喜欢。

难道没有人偏离模式而变得“酷”吗?那不就是创新吗?

是的,有时候,一份非常独特地呈现的简历会因为与众不同而获得工作。我通常听说网页设计师通过编译和呈现他们作品的 CD 电影,或者制作一个解释他们作品的动画角色,并将其发布在他们的博客上,从而获得了一些好工作。

但是……这是实验*(创新源于成功的实验)*。

在大多数软件开发中,由于时间压力、预期等原因,您无法承担实验的风险,但有时,一些有趣的项目确实允许一些实验。

在软件中,我们不能用 101 种方式来做基本的事情,比如银行存款……处理银行存款只有少数几种方式……所以遵循已建立且经过测试的模式是有意义的。

此外,大多数设计模式都有变体……其中一些变体非常受欢迎,以至于这些变体本身也会成为一种新的标准模式类型。

如今的软件项目(至少是隐含地)被期望遵循市场上类似产品/软件的已建立设计。

这就是遵循标准的编码风格或设计模式可以帮助软件开发的地方……加快开发速度,消除为新的未经测试的实现而烦恼的开销等。

加快开发时间

遵循标准设计模式的另一个优点是,可以在软件架构师、模块负责人、团队负责人、开发人员等层级之间轻松沟通“如何”开发某项内容,而不仅仅是“什么”内容需要开发。

有时,它甚至对测试团队有帮助,因为测试人员会根据经验知道遵循特定设计模式的代码可能需要用一套特定的测试工具在一定时间内以特定方式进行测试,而且这些已知的设计可能没有某些缺陷,或者有一些“已知”的缺陷。

使用设计模式会不会剥夺个性化风格?

不。首先,我们并不是说您必须遵循设计模式并且不能做任何其他事情。大多数项目实现与其他项目只有基本要求相似,并且很可能存在偏差。构建这些偏差需要灵活地运用和扩展在实现中使用过的标准模式。

这就像用标准方法制作披萨,然后根据不同的需求进行调味/呈现,例如全饼披萨,或切片披萨,或其他任何形式。

在理解设计模式的重要性时,有一点**非常**重要:

设计模式不是某个公司或编程语言强加给我们的任何技术或框架。也就是说,它就像一个开放的概念……您可以自由地采用它,使用它,根据您的需求修改它,最重要的是……让它感觉属于您自己。

所有标准或流行的设计模式,实际上,都可以很大程度地扩展……它们之所以流行,首先是因为许多人都在使用它们……而许多人之所以使用它们,是因为它们对他们的需求具有灵活性。

否则,您认为一个标准设计模式如何能同时适用于新泽西一家公司的项目,以及班加罗尔另一家公司的一个不同类型的项目?

这就引出了“**大多数设计模式是通用的**”……也就是说,它们并不总是用于构建同一种软件。在常见的讨论中,您可能不会听到诸如“银行软件设计模式”或“社交网络软件设计模式”之类的说法……而只会听到“设计模式”。

谁应该关心设计模式?

  1. 就像一位优秀的建筑师通过一生学习各种建筑和形状的建筑和设计来提升他的技能一样,一位软件架构师应该研究和可视化全球不同的软件/技术系统是如何设计的。
  2. 就像建筑工人应该了解实现建筑设计的不同方法一样,无论是通过自己的经验还是从建筑师那里理解,软件开发人员/程序员都应该理解基本的软件设计模式及其实现代码……无论是自己理解,还是从指示团队遵循特定模式开发的软件架构师那里学习。

基本代码模式

在本篇文章的开篇,我曾说过任何程序员都可能使用过设计模式。以下是一些遵循模式的代码的非常基本的例子。

   try{

   }catch(Exception ex){

   }
   finally{

   }
  1. 下面是一个基本**拦截过滤器**设计模式。
    switch (condition){
         case Value1:
         
         case Value2:
    
         default:
    }
  2. 事件触发器、事件处理程序……属于基本的**主题-观察者**设计模式。我们将很快讨论每种模式的标准、流行变体以及示例……
  3. 如果您使用过一些集合类型,例如 C# 中的 `Arraylist`,并遍历数组,那么您就使用了一个基本的**迭代器**设计模式。
  4. 下面的代码是基本异常处理 / **责任链**模式的示例。

设计模式的不同领域

软件中除了设计模式之外,还有不同的术语……其中一些通常与我们到目前为止讨论过的设计模式相关……而另一些则完全不相关。

我们到目前为止讨论的有时被称为“**实现设计模式**”。

还有其他,如**架构模式**、**框架模式**、**语言模式**(主要称为语言构造)。

它们是处于不同级别的模式……例如,**语言模式**是作为 C#/Java 等编程语言的一部分实现的模式,是语言的特性/构造……我们已经看到过其中一些。

上面关于主题-观察者、拦截过滤器等的所有示例,在 C 之后出现的所有流行高级编程语言中,都被吸收为语言构造。

**架构模式**是软件架构的标准模型,通常指不同的模块、层或层级的放置或链接方法,构成完整的应用程序。

这与编程/编码意义上的设计模式完全无关……但它们在本文所讨论的“为什么”/“是什么”方面有着相同的答案。

**框架模式**也与我们对设计模式的讨论无关。当 .NET 等框架实现特殊的错误日志记录或通过框架内置方法或对象轻松跟踪代码执行路径的方法时,这些机制被称为框架模式。

例如,.NET 框架中的 `stackTrace` 功能,类
属性功能(在类/方法定义顶部带有 [] 方括号等)。使用这些功能时,我们正在使用框架内置的模式进行编码。

我希望本文能够提供设计模式及相关术语的概述。

到目前为止,我们只讨论了标准是什么以及它们有多重要……但我们没有讨论标准模式本身是什么。

在下一篇文章 [设计模式详解] 中,我们将通过示例讨论基本实现设计模式。

© . All rights reserved.