<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>01基础知识 on 菜鸟程序员</title><link>https://www.azhw.com.cn/%E7%BC%96%E7%A8%8B/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/01%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/</link><description>Recent content in 01基础知识 on 菜鸟程序员</description><generator>Hugo</generator><language>zh-cn</language><atom:link href="https://www.azhw.com.cn/%E7%BC%96%E7%A8%8B/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/01%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/index.xml" rel="self" type="application/rss+xml"/><item><title>01设计模式概述</title><link>https://www.azhw.com.cn/%E7%BC%96%E7%A8%8B/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/01%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/01%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E6%A6%82%E8%BF%B0/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.azhw.com.cn/%E7%BC%96%E7%A8%8B/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/01%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/01%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E6%A6%82%E8%BF%B0/</guid><description>&lt;h2 id="设计模式从何而来">设计模式从何而来&lt;a class="td-heading-self-link" href="#%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%bb%8e%e4%bd%95%e8%80%8c%e6%9d%a5" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>与很多软件工程技术一样，模式起源于建筑领域，毕竟与只有几十年历史的软件工程相比，已经拥有几千年沉淀的建筑工程有太多值得学习和借鉴的地方。&lt;/p>
&lt;p>那么模式是如何诞生的？让我们先来认识一个人——Christopher Alexander（克里斯托弗.亚历山大），哈佛大学建筑学博士、美国加州大学伯克利分校建筑学教授、加州大学伯克利分校环境结构研究所所长、美国艺术和科学院院士……头衔真多，不过他还有一个“昵称”——模式之父(The father of patterns)。
Christopher Alexander博士及其研究团队用了约20年的时间，对住宅和周边环境进行了大量的调查研究和资料收集工作，发现人们对舒适住宅和城市环境存在一些共同的认同规律，Christopher Alexander在著作《A Pattern Language: Towns, Buildings, Construction》中把这些认同规律归纳为253个模式，对每一个模式(Pattern)都从Context（前提条件）、Theme或Problem（目标问题）、 Solution（解决方案）三个方面进行了描述，并给出了从用户需求分析到建筑环境结构设计直至经典实例的过程模型。&lt;/p>
&lt;p>在Christopher Alexander的另一部经典著作《建筑的永恒之道》中，他给出了关于模式的定义：&lt;/p>
&lt;p>&lt;b style="font-color: red;">每个模式都描述了一个在我们的环境中不断出现的问题，然后描述了该问题的解决方案的核心，通过这种方式，我们可以无数次地重用那些已有的成功的解决方案，无须再重复相同的工作。&lt;/b>&lt;/p>
&lt;p>这个定义可以简单地用一句话表示：&lt;/p>
&lt;p>&lt;b>模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。&lt;/b>&lt;/p>
&lt;p>【A pattern is a successful or efficient solution to a recurring problem within a context】&lt;/p>
&lt;p>1990年，软件工程界开始关注ChristopherAlexander等在这一住宅、公共建筑与城市规划领域的重大突破。&lt;/p>
&lt;p>最早将模式的思想引入软件工程方法学的是1991-1992年以“四人组(Gang of Four，简称GoF，分别是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides)”自称的四位著名软件工程学者，他们在1994年归纳发表了23种在软件开发中使用频率较高的设计模式，旨在用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟。&lt;/p>
&lt;p>GoF将模式的概念引入软件工程领域，这标志着软件模式的诞生。&lt;/p>
&lt;p>软件模式(Software Patterns)是将模式的一般概念应用于软件开发领域，即软件开发的总体指导思路或参照样板。&lt;/p>
&lt;p>软件模式并非仅限于设计模式，还包括架构模式、分析模式和过程模式等，实际上，在软件开发生命周期的每一个阶段都存在着一些被认同的模式。&lt;/p>
&lt;p>软件模式是在软件开发中某些可重现问题的一些有效解决方法，软件模式的基础结构主要由四部分构成，包括&lt;/p>
&lt;ol>
&lt;li>问题描述【待解决的问题是什么】&lt;/li>
&lt;li>前提条件【在何种环境或约束条件下使用】&lt;/li>
&lt;li>解法【如何解决】&lt;/li>
&lt;li>效果【有哪些优缺点】&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://www.azhw.com.cn/content/%E7%BC%96%E7%A8%8B/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/01%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/01%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E6%A6%82%E8%BF%B0/%E8%BD%AF%E4%BB%B6%E6%A8%A1%E5%BC%8F%E5%9F%BA%E6%9C%AC%E7%BB%93%E6%9E%84.gif" alt="软件模式基本结构">&lt;/p>
&lt;p>软件模式与具体的应用领域无关，也就是说无论你从事的是移动应用开发、桌面应用开发、Web应用开发还是嵌入式软件的开发，都可以使用软件模式。&lt;/p>
&lt;p>在软件模式中，设计模式是研究最为深入的分支，&lt;b>设计模式用于在特定的条件下为一些重复出现的软件设计问题提供合理的、有效的解决方案&lt;/b>，它融合了众多专家的设计经验，已经在成千上万的软件中得以应用。 1995年， GoF将收集和整理好的23种设计模式汇编成&lt;i>Design Patterns: Elements of Reusable Object-Oriented Software&lt;/i>【《设计模式：可复用面向对象软件的基础》】一书，该书的出版也标志着设计模式正式成为面向对象(Object Oriented)软件工程的一个重要研究分支。&lt;/p></description></item><item><title>02面向对象设计原则</title><link>https://www.azhw.com.cn/%E7%BC%96%E7%A8%8B/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/01%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/02%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.azhw.com.cn/%E7%BC%96%E7%A8%8B/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/01%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/02%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99/</guid><description>&lt;h2 id="概述">概述&lt;a class="td-heading-self-link" href="#%e6%a6%82%e8%bf%b0" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>对于面向对象软件系统的设计而言，在支持可维护性的同时，提高系统的可复用性是一个至关重要的问题，如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。&lt;/p>
&lt;p>在面向对象设计中，可维护性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计的思想，可以从不同的角度提升一个软件结构的设计水平。&lt;/p>
&lt;p>&lt;strong>面向对象设计原则为支持可维护性复用而诞生，这些原则蕴含在很多设计模式中，它们是从许多设计方案中总结出的指导性原则&lt;/strong>。&lt;/p>
&lt;p>面向对象设计原则也是我们用于评价一个设计模式的使用效果的重要指标之一，在设计模式的学习中，大家经常会看到诸如“XXX模式符合XXX原则”、“XXX模式违反了XXX原则”这样的语句。&lt;/p>
&lt;p>最常见的7种面向对象设计原则如下表所示：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th style="text-align: left">&lt;strong>设计原则名称&lt;/strong>&lt;/th>
 &lt;th style="text-align: left">&lt;strong>定  义&lt;/strong>&lt;/th>
 &lt;th style="text-align: left">&lt;strong>使用频率&lt;/strong>&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td style="text-align: left">单一职责原则(Single Responsibility Principle, SRP)&lt;/td>
 &lt;td style="text-align: left">一个类只负责一个功能领域中的相应职责&lt;/td>
 &lt;td style="text-align: left">★★★★☆&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">开闭原则(Open-Closed Principle, OCP)&lt;/td>
 &lt;td style="text-align: left">软件实体应对扩展开放，而对修改关闭&lt;/td>
 &lt;td style="text-align: left">★★★★★&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">里氏代换原则(Liskov Substitution Principle, LSP)&lt;/td>
 &lt;td style="text-align: left">所有引用基类对象的地方能够透明地使用其子类的对象&lt;/td>
 &lt;td style="text-align: left">★★★★★&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">依赖倒转原则(Dependence  Inversion Principle, DIP)&lt;/td>
 &lt;td style="text-align: left">抽象不应该依赖于细节，细节应该依赖于抽象&lt;/td>
 &lt;td style="text-align: left">★★★★★&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">接口隔离原则(Interface Segregation Principle, ISP)&lt;/td>
 &lt;td style="text-align: left">使用多个专门的接口，而不使用单一的总接口&lt;/td>
 &lt;td style="text-align: left">★★☆☆☆&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">合成复用原则(Composite Reuse Principle, CRP)&lt;/td>
 &lt;td style="text-align: left">尽量使用对象组合，而不是继承来达到复用的目的&lt;/td>
 &lt;td style="text-align: left">★★★★☆&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td style="text-align: left">迪米特法则(Law of Demeter, LoD)&lt;/td>
 &lt;td style="text-align: left">一个软件实体应当尽可能少地与其他实体发生相互作用&lt;/td>
 &lt;td style="text-align: left">★★★☆☆&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="单一职责原则">单一职责原则&lt;a class="td-heading-self-link" href="#%e5%8d%95%e4%b8%80%e8%81%8c%e8%b4%a3%e5%8e%9f%e5%88%99" aria-label="Heading self-link">&lt;/a>&lt;/h2>
&lt;p>单一职责原则是最简单的面向对象设计原则，它用于控制类的粒度大小。单一职责原则定义如下：&lt;/p>
&lt;blockquote>
&lt;p>单一职责原则(Single Responsibility Principle, SRP)：一个类只负责一个功能领域中的相应职责，或者可以定义为：就一个类而言，应该只有一个引起它变化的原因。&lt;/p>&lt;/blockquote>
&lt;p>单一职责原则告诉我们：一个类不能太“累”！在软件系统中，一个类（大到模块，小到方法）承担的职责越多，它被复用的可能性就越小，而且一个类承担的职责过多，就相当于将这些职责耦合在一起，当其中一个职责变化时，可能会影响其他职责的运作，因此要将这些职责进行分离，将不同的职责封装在不同的类中，即将不同的变化原因封装在不同的类中，如果多个职责总是同时发生改变则可将它们封装在同一类中。&lt;/p>
&lt;p>单一职责原则是实现高内聚、低耦合的指导方针，它是最简单但又最难运用的原则，需要设计人员发现类的不同职责并将其分离，而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。&lt;/p>
&lt;p>下面通过一个简单实例来进一步分析单一职责原则：&lt;/p>
&lt;p>例如一个CRM（Customer Relationship Management）客户管理系统）系统中客户信息图形统计模块的初始设计方案&lt;/p>
&lt;p>&lt;img src="https://www.azhw.com.cn/content/%E7%BC%96%E7%A8%8B/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/01%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/02%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99/CRM%E5%88%9D%E5%A7%8B%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88%E7%BB%93%E6%9E%84%E5%9B%BE.jpg" alt="初始设计方案">&lt;/p>
&lt;p>CustomerDataChart类中的方法说明如下：&lt;/p></description></item></channel></rss>