值得反复品味的面向对象设计模式

本文原创,转载请注明出处。
欢迎关注我的 ,关注我的专题 Android Class 我会长期坚持为大家收录上高质量的 Android 相关博文。

周末了拥有大块时间,是一个充电的好时机,本文给大家带来设计模式的读书笔记,希望能给你带来一些帮助。

前文:
值得反复品味的面向对象六大原则

设计模式

在软件工程中,设计模式是对软件设计中普遍存在、反复出现的各种问题所提出的通用解决方案。这个术语是由 Erich Gamma 等人在1990 年从建筑设计领域引入到软件工程领域,从此设计模式在面向对象设计领域逐渐被重视起来。

设计模式并不直接用来完成代码的编写,而是描述在各种情况下要如何解决软件设计问题。面向对象设计模式通常以类或对象来描述其中的关系和相互作用,他们的相互作用能够使软件系统具有高内聚、低耦合的特性,并且使软件能够应对变化。

模式的4个要素

模式名称
模式名称用一两个词来描述模式的问题、解决防范和效果。基于一个模式词汇表,同行、同事之间就可以通过它们进行交流,文档中也可以通过模式名来代表一个设计。模式名可以帮助我们思考,便于我们与其他人交流设计思想以及设计结果。

问题
描述了应该在什么情况使用设计模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,例如,某个设计不具备良好的可扩展性等,也可能描述了导致不灵活设计的类或者对象结构。

解决方案
描述了设计的组成成分,它们之间的相互关系以及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同的场合,所以解决方案并不描述一个具体的设计或者实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的类或者对象组合来解决这个问题。

效果
描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象的设计要素之一。所以模式效果包括对它系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。

设计模式为反复出现的局部软件设计问题指出了通用的解决方案,在很大程度上促进了面向对象软件工程的发展。它将这些常见的设计问题一一总结,将大师们的经验、教训、设计经验分享给了所有人,使得即便是刚刚入行的工程师,也能够设计出可扩展、灵活的软件系统,大大提升了软件质量。关于设计模式领域的书籍大家可以参考《设计模式之禅》、《Android 源码设计模式解析与实战》。

避免掉进过度设计的怪圈

当你掌握一些设计模式或者手法之后,比较容易出现的问题就是过度设计。有的人甚至在一个应用中一定要将 23 种常见的设计模式运用上,这就本末倒置了。设计模式的四大要素中就明确指出,模式的运用应该根据软件系统所面临的问题来决定是否需要使用现有的设计。也就是说,再出现问题或者你预计会出现那样的问题时,才推荐使用特定的设计模式,而不是将各种设计模式套进你的软件中。

不管在设计、实现、测试之剑有多少时间都应该避免过度设计,它会打破你的反馈回路,使你的设计得不到反馈,从而慢慢陷入危险中。所以你只需要保持简单的设计,这样就有时间来测试该设计是否真的可行,然后作出最后的决策。

当设计一款软件时,从整体高度上设定一种架构模式,确定应用的整体架构,然后再分析一些重要米快的设计思路,并且保证他们的简单性、清晰性,如果有时间可以使用 Java 代码模拟一个简单的原型,确保设计是可行的,最后就可以付诸行动了。切实不要过度的追求设计,适当就好,当我们发现或者预计到将要出现问题时,在判断是否需要运用设计模式。

反模式

反模式是一种文字记录形式,描述了对某个问题必然产生的消极后果的常见解决方案。由于管理人员或者开发人员不知道更好的解决方案,缺乏决定特定问题的经验或知识,或者说不适合的条件下套用了某个设计模式,这些都会造成反模式。与设计模式类似,反模式描述了一个一般的形式,主要原因、典型症状。后果,以及最后如何通过重构解决问题。

反模式是把一般情况映射到一类特定解决方案的有效方法。反模式的一般形式为它所针对的哪类问题提供了一个易于辨识的模板。此外,它还清楚地说明了与该问题相关联的症状以及导致这一问题的内在原因:把特定设计模式应用于不正确的环境。

反模式为识别软件行业反复出现的问题提供了实际经验,并为大多数常见的问题提供了详细的解决方案。反模式对业界常见的问题进行总结,并且告诉你如何识别这些问题以及如何解决。它有效的说明了可以在不同的层次上采取的措施,以便改善应用开发过程,软件系统和对软件项目的有效管理。

总的来说,设计模式总结了在特定问题下正确的解决方案,而反模式则是告诉你在特定问题上的错误解决方案和他们的原因、解决方案,通过最终的解决方案,它能够将腐化的软件系统拉回正轨。

总结

灵活的软件设计需要知识和经验与思考,好的设计通常是经历了时间的洗礼慢慢演化而来,工程师的成长也是一样。因此,掌握必要的面向对象、设计模式、反模式等知识,并且这工作中不断实践、思考,将使你的软件设计之路走得更加从容、顺畅。

你可能感兴趣的:(值得反复品味的面向对象设计模式)