关键词:
C++ 设计模式
对 于任何还不熟悉设计模式的人来说,在对这个领域进行简短的纵览之后,可能会留下这样的印象:设计模式是一个市场营销大骗局,它不过是一些简单的编程技术, 或者不过是计算机科学家(这些科学家没事应该多出来走走)的玩物。尽管这些印象都有那么一点道理,然而设计模式的确是职业C++程序员工具箱中不可或缺的组件。
设 计模式是一个被反复谈论的架构主题,它为特定上下文中的常见设计问题提供了解决方案,并描述了这种解决方案的结果。设计模式不仅仅是对技术的简单描述,它 还是从现有的成功实践一点一滴汇集起来的设计智慧的具名封装,并以容易交流和复用的方式编写而成。模式关乎程序员之间的顺畅交流。
从 实践的角度来看,设计模式具有两个重要的属性。首先,它们描述了经过验证的、成功的设计技术,这些技术可以按上下文相关的方式进行定制,以便满足新的设计 场合的要求。其次,并且可能更重要的是,在提及某个特定模式的应用时不仅包括其中用到的技术,还包括应用该模式的动因以及应用后所达到的效果。
这 类事情并不是什么新东西。考虑一个来自算法领域的类比(需要说明的是,算法不是设计模式,也不是“编程模式”,它们只是算法,这里只不过是一个类比而 已)。考虑(我可能对一个同事作的)如下声明:“有一个未排序的序列,必须要进行很多次搜索。因此,希望对其进行快速排序,并且使用二分查找来执行每一个 查找。”能够使用术语“快速排序”和“二分查找”,这种价值是不可估量的,不但在设计方面如此,在就该设计与受过教育的同事进行交流时也是如此。当我说 “快速排序”时,我的同事知道我正在排序的序列具有随机存取结构,并且它的排序时间复杂度为O(nlog2n),同时该序列中的元素可以采用类似小于操作符进行比较。当我说“二分查找”时,我的同事知道(即使事先没有提到“快速排序”)序列已经被排序过了,定位感兴趣的元素所执行的比较操作的时间复杂度为O(log2n), 并且存在一个适当的操作来对序列中的元素进行比较。标准算法所具有的共享的知识以及标准词汇表,不但允许高效地记录文档,而且允许对设计方案进行有效的评 议。比方说,如果我计划对一个单向链接表结构来执行这个查找和排序过程,我的同事立刻会自鸣得意地哈哈大笑,并指出在这种情形下我不能使用快速排序并且可 能不希望使用二分查找。
在 设计模式出现之前,在对面向对象设计的文档化、交流以及高效地评议方面,这些优点都不具备。我们被迫低水平地描述我们的设计,这种方式低效且不够精确。这 并不是说用于复杂面向对象设计的技术尚不存在,而是这些技术尚未以一个共享的、通用术语的方式为整个编程社群所用。设计模式解决了这个问题,我们现在可以 像描述算法设计一样高效、毫无歧义地描述面向对象设计。
举个例子,当我们看到Bridge模 式被应用到某项设计中时,我们知道在一个简单的机制层面,抽象数据类型实现被分离成一个接口类和一个实现类。此外,我们知道这样做的原因是为了将接口从实 现强有力地分离出来,这样,对实现的改变将不会影响到使用接口的用户。我们还知道这种分离会带来运行期开销,知道应该怎样对抽象数据类型的源代码进行布 局,还知道许多其他细节。模式的名字是关于某项技术的诸多信息和经验的高效且无歧义的“句柄”,在设计和文档中小心并正确地使用模式和模式术语,可以使代 码和设计更加明晰。
那些严谨的模式专家有时以某种文献的形式来描述模式(他们确实是这么做的),这种描述遵循某种正式的结构。还有几种常见的变体也在使用,但不管哪种描述方式,均包含以下4个必不可少的部分。
首先,设计模式必须具有一个毫无歧义的名字。例如,术语“包装器(wrapper)”对于设计模式命名来说就没有什么意义,因为它早已被广泛使用并且具有许多不同的含义。使用“Wrapper”这样的术语来命名某种设计模式只会带来混淆和误解。实际的做法是,以前在“wrapper”名下的设计技术现在分别被指派为“Bridge”、“Strategy”、“Facade”、“Object Adapter”以及其他一些模式名字。使用精确的模式名字比使用不那么精确的名字具有“明显”的优势,就像术语“二分查找”比“查找”更精确、更有意义一样。
其次,模式描述必须定义该模式所能解决的问题。这种描述可以相对宽泛,也可以相对狭窄。
再次,模式描述要记述该问题的解决方案。根据陈述的问题,该解决方案可以相对高级,也可以相对低级,但无论如何,它应该具有足够的通用性,以便可以根据问题可能出现的不同上下文进行定制。
最后,模式描述要记述将该模式应用于某个上下文的后果。在应用该模式后,该上下文是如何发生改变的?不管是变好,还是变坏。
拥 有模式的知识可以使一名糟糕的设计师摇身一变成为一名优秀的设计师呢?呃,是给出另一个类比的时候了:设想你被迫学习某一门让人痛苦的数学课,它的期末考 试内容是证明某个数学领域中的许多定理。如何才能从这门课中死里逃生呢?当然,最显而易见的方式是成为一个天才。你从最初的原理开始,进而研究整个数学分 支的基础知识,最终证明那些定理。一个更为实际的途径是,你牢记并消化该数学领域中的大量定理,并使用你所具备的任何天赋的数学能力、灵感以及好运去选择 适当的辅助定理,然后以某种逻辑“胶水”将它们粘合在一起,从而最终证明新的定理。是的,甚至对于那些“传说中的天才”来说,这种方式都是很有优势的,因 为基于现成的定理来证明会更高效,同“凡夫俗子”交流起来也更容易。当然,熟悉辅助定理并不能保证一个可怜的学数学的学生通过考试,但这类知识至少可以使 其能够理解别人给出的证明。
同样的道理,从最初的原理进而到复杂的面向对象设计也是颇为无趣的,而且与他人交流最终设计也很困难。组合使用各种设计模式来生成面向对象设计,类似于在数学中使用辅助定理来证明一个新的定理。设计模式常常被描述为“微架构(micro-architecture)”,它们可以与其他模式进行组合从而生成一个新的架构。当然,选择适当的模式并有效地对其进行组合,也是需要设计方面的专家经验和天资禀赋的。不过,一旦设计完成后,甚至你的经理都能够理解完整的设计方案,只要他具备一些必需的模式方面的知识即可。
分享到:
相关推荐
《C++必知必会PDF简体中文版》是一本专注于C++编程语言核心知识和技术要点的图书。本书由Stephen C. Dewhurst所著,并由荣汐翻译成简体中文。作为图灵程序设计丛书之一,本书在出版之初便获得了业界的广泛认可,被...
本书描述了C++编程和设计中必须掌握但通常被误解的主题,这些主题涉及的范围较广,包括指针操作、模板、泛型编程、异常处理、内存分配、设计模式等。作者根据本人以及其他有经验的管理人员和培训老师的经验总结,对...
本书描述了C++编程和设计中必须掌握但通常被误解的主题,包括指针操作、模版、泛型编程、异常处理、内存分配、设计模式等。作者称这些知识为C++程序员必备的"常识",其实并非意味着简单或平庸,而是"必不可少"。 ...
《C++必知必会》是一本专注于C++编程语言深度解析的书籍,旨在帮助读者理解和掌握C++中那些至关重要的、但往往容易被误解的概念和技术。C++是一种多范式编程语言,融合了面向过程、面向对象以及泛型编程的特点,因此...
### 《C++必知必会》电子书关键知识点概览 #### 一、书籍简介与作者背景 《C++必知必会》是一本专为职业C++程序员准备的电子书,由美国作者Stephen C. Dewhurst撰写,荣耀翻译。Stephen C. Dewhurst拥有超过20年的...
原书名: C++必知必会——图灵程序设计丛书 - 原出版社: 作者: (美)杜赫斯特 著,荣耀 译 出版社: 人民邮电出版社 书号: 7115141019 出版日期:2006-1-1 开本: 大16开 页码: ...
原书名: C++必知必会——图灵程序设计丛书 - 原出版社: 作者: (美)杜赫斯特 著,荣耀 译 出版社: 人民邮电出版社 书号: 7115141019 出版日期:2006-1-1 开本: 大16开 页码: ...
《C++必知必会》是一本针对C++初学者的经典入门教材,旨在帮助读者全面理解和掌握C++编程语言的基础知识和核心概念。这本教材将全书内容分为63个独立的章节,每个章节对应一个PDF文件,方便读者根据需要进行查阅和...
本书描述了C++编程和设计中必须掌握但通常被误解的主题,这些主题涉及的范围较广,包括指针操作模板、泛型编程、异常处理、内存分配、设计模式等。作者根据本人以及其他有经验的管理人员和培训老师的经验总结,对与...
本书描述了C++编程和设计中必须掌握但通常被误解的主题,这些主题涉及的范围较广,包括指针操作模板、泛型编程、异常处理、内存分配、设计模式等。作者根据本人以及其他有经验的管理人员和培训老师的经验总结,对与...
《C++二十三种设计模式》是一本深入探讨软件设计艺术的专业书籍,它详细阐述了在C++编程语言中如何运用经典的设计模式来提升代码的可读性、可维护性和可扩展性。设计模式是软件工程中经过长期实践验证的最佳实践,是...
本书描述了C++ 编程和设计中必须掌握但通常被误解的主题,这些主题涉及的范围较广,包括指针操作、模板、泛型编程、异常处理、内存分配、设计模式等。作者根据本人以及其他有经验的管理人员和培训老师 的经验总结,...
这份"必知必会"的PDF教程是C++学习者的重要参考资料,无论你是初学者还是有经验的职业C++程序员,都能从中受益。 1. **C++基础语法**:C++基于C语言,但增加了类、模板等面向对象特性。初学者首先要掌握基本的语法...
本书描述的是C++编程以及设计中必须掌握,但通常会犯错误的内容,这里的内容范围比较广。包括指针操作、模板、泛型编程、内存分配、设计模式等,本舒适和中高级C++程序员设计者参考!
从提供的文件信息中,我们可以推断该课件《C++设计模式课件25_Interpreter.pdf》是关于C++语言实现设计模式中的解释器模式(Interpreter Pattern)的一部分教学资料。文件中出现的网站***和网易云课堂是指两个在线...
如GoF所言,一旦你深入理解设计模式并且能够有效应用,你将会以一种非同寻常的方式思考面向对象设计。 此外,设计模式还能帮助开发者和团队成员沟通,因为这些模式已经成为软件开发的通用语言,团队成员能够以这些...
本书描述了C++编程和设计中必须掌握但通常被误解的主题,这些主题涉及的范围较广,包括指针操作、模板、泛型编程、异常处理、内存分配、设计模式.............
为了帮助大家更好地学习和使用C++,本文将介绍三本重要的参考资料:《高质量C++/C编程指南》、《C++设计模式》以及《C++标准程序库》。 首先,《高质量C++/C编程指南》不仅仅是一本基础教程,它为学习者提供了一个...
在IT行业中,设计模式是一种被广泛认可的解决软件设计中常见问题的最佳实践。它们是经过时间验证的解决方案模板,可以...设计模式是软件工程的基石,对于任何希望提升其C++编程技能的开发者来说,都是必不可少的知识。
本资料包聚焦于C++的性能优化和设计模式,这些都是提升软件质量和效率的关键因素。以下是这些主题的详细讨论: 首先,"headfirst设计模式.pdf"这本书籍是关于设计模式的经典读物。设计模式是解决软件开发中常见问题...