企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# <center>1.1什么是设计模式</center> 下面我们给出steve的故事有助于描述现实生活环境中的设计模式,我希望读者从未听过这个故事。 ## <center>1.1.1一个普通的示例</center> steve 在一家 大型保险公司工作,他最近的工作是一开发一个通过Web界面将客户信息显示给电话客服中心代表的软件。Steve设计了一个复杂的系统,这个系统允许电话客服中心代表搜索某个客服中心代表的软件。Stevey设计了一个复杂的系统,这个系统允许电话客服中心代表搜索某个客户、输入电话记录、更新客户保险金额信息以及处理付款。系统的安装非常顺利,几乎没有出现在产品环境中安装新软件时经常遇到的麻烦。Steve非常高兴,倍感轻松,接下来似乎应当坐下来,惬意地品尝一下咖啡了。 很快保险公司最新的投资规模达到了以前的3倍。不仅Steve被叫回为电话客服中心软件提供新的可扩展性和增强处理,而且公司急切希望在其站点上为新招揽和客户提供某些新的功能。Steve所在的部门也为此增加了两名开发人员:Andy和Jason。 公司副总提出的要求是:在客户完成成功和安全的登录后,公司的站应当允许客户自己进行相关的支付操作。此外,系统应当显示客户呼入电话客服中心的次数。最后,系统应当 显示客户帐户对电话客服中心软件进行的所有改动的审计日志。 Steve知道:简单地更新电话客服中心软件就能够提供审计日志,随后复制并改进代码就可以使用支付处理功能。但是,新加入的编程人员需要尽快投入到新系统的开发工作中。Steve的老板希望两人接手Steve最熟悉的项目部分。考虑到Steve是经验最丰富的顶尖PHP编程人员,老板需要Steve尽快完成公司站点的其他部分,然后再投入到新加入编程人员对电话客服中心软件的审计功能的修改工作中。最后,Steve还要负责为用户登录界面的新支付处理部分提供挂钩程序。 Steve先前编写的代码不算糟糕,但是Jason似乎要花费很长时间才能理解这些代码并完成将支付处理部分移植入公司站点的工作。因此,Jason决定采用自己的方法来编写代码,以便于更快地完成任务。Jason向Steve报告了自己的想法,随即按照这个思路着手开展工作。Andy同样也忙忙碌碌,因为他刚获得计算机科学专业的硕士学位,所以没有太多经验应对时而混乱的代码。 经过加班加点的工作,这个团队终于成功地完成了对新代码的更改工作。Andy认为整个开发还可以采用更好的体系结构。Steve觉得:其他编程人员如果只是复制和粘贴他原先设计的代码 ,那么开发进度会更快;Jason和Andy只需要进行一些改进,问题就会迎刃而解。Jason则迫切想解开自己的困惑:为什么某些功能在代码中的不同部分实现的方式不同。 随差公司Web站的访问量越来越多,系统的性能开始变的越来越差。因此,Steve的老板建议开发团队花时间对代码进行优化。 Jason发现他为支付处理操作编写的方法与Steve编写的方法几乎完全相同。因此,Jason将这些方法组合写入一个类中。Steve则开始查看他为电话客服中心站点编写的身份证验证代码与他为公司站点的用户登录编写的类之间的共性。Andy意识到他们创建的所有PHP页面的顶部具有一组相同的函数调用。因此,他创建了一个引导类型类,以便将所有这些耿耿数调用放在同一个位置,进而减少了代码的重复。 作为局外人,我们可以客观地看到很多问题。Steve的代码可以按照自己的方式从通用性中受益。Andy在软件设计方法所受到的正规教育使他有是会对PHP完成任务的能力以及体系结构提出质疑。Jason无法累世易地理解Steve设计的支付系统,因此他选择自己从头开始创建,从而导致代码的重复。最后,经过对软件的分析,这个开发团队开始在看上去混乱的代码库中发现了各种模式。自此,开发团队开始转向处理模式。 ## <center>1.1.2设计模式能够解决相同的问题</center> 在上面的示例中,Steve团队的错误实际上与设计模式概念的第一个重要部分有关。在软件开发中,该团队并未明确地创建模式。模式往往是通过实际环境中的实践和应用发现的。将支付应用系统和引导类型调用合并入特定类就属于在编程过程中标识模式的示例。 有人曾经说过,所有有音乐片断都能找到出处。如今,创作新的音乐只是将特定的音符按照不同的顺序和速度进行重新的排列。除了某些实现重大突确的特例之外,通常的软件开发也具有类似的情况。相同的问题会不断地重复出现,并且需要通用的解决方法。因此,对于这些相同的问题来说,设计模式是一种可重用的解决方案。 任何提及设计模式的书箱都离不开著名的“四人组(Gang of Four)":Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides,这四个人是最早介绍设计模式的书箱和作者。在自己的领域从事长期工作之后,他们开始注意到不同开发项目中出现的设计的特定模式。这4个人将这些想法汇集到一起,从而形成了最早的设计模式概念。通过将特定模式标识为用于未来开发的模板,他们能够将设计模式表达为易于理解的参照基准,以便人们能更好地理解大型和复杂的编程概念。 设计模式涵盖了从接口设计到体系结构的许多方面,甚至包括市场营销和度量。本书主要关注使用面向对像编程方法构造开发语言。 > 软件设计中的问题由下列3部分组成: 1. what:要考虑的相关业务和功能需求。 1. how:如何使用特定设计满足上述需求。 1. workk:实际的实现,或者说如何投入应用和实践。 设计模式正好对应该过程和how部分,因此本书阐述了如何解决这些问题以及成功解决问题所需的部分实现工作。可以将php描绘为解决问题所彩用的载体。一旦知道了软件需要完成的功能,就能够设计如何完成这些功能,从而通过更少的重构更容易地实现所有功能 我们已经提到,本书的重点并不是对php语言的掌握以及对期复杂性的理解,而是在于描述通用的、经过时间检验的一系列方法及其与php的联系。 从前面的示例中可以看出,模式当然是从软件开发阶段开始的。不过,如果摇篮有涉及现有模式的完整资料,那么就能够更快地计划体系结构和做出更好的选择。此外来自不同软件领域的编程人员能够识别该模式,并具只需将期改写为特定的语言类型。应用程序应采用一组清晰的模式,这有于团队新成员理解项目,从而避免浪费太多时间 ## 1.1.3设计模式无处不在 我们已经介绍过,Steve的团队能够理解期软件中的基本模式以及创建可重用项,现在我们也能够进行自己的软件一切,有多少次使用自己的有类创建相同的用户登录和身份验证系统?是否在希望的位置使用了db()函数?这些都是如何使用模式的示例。 在偏爱PEAR或其他架构库中,能够发现更详细的和更接近于基础模式的示例。例如,使用PEAR DB是应用设计模式(特是工厂方法的示例)。zend framework也会使用各种不同模式(如单无素模式和适配器模式)。 ## 1.14设计模式的公共部分 为了描述设计模式,“四人组”首先提出了一个文档标准,并且在著作中将该文档标准应用于所介绍的每种模式。“四人组”之后PHP相关书箱的甩有作者都复制了这种严格的格式,并且不断地普及该文档形式。因为我觉得这方面的相关介绍非常多,并且只是结构问题,所以本书不会再做过多描述。这里只是简单介绍改线 个模式的文档的四个主要部分: 1. 名称 2. 问题与解决方案 3. 统一建模语言(Unified Modeling Language,UML)图以及代码示例 1.名称 在设计模式中,名称实际上比您最初想像的更重要。对于向项目和其他模式解释特定模式的行业和关系来说,适当的描述性命名约定大有帮助。 在本单的示例中,我们注意到Jason向Steve提及自己准备重写支付处理系统的一部分代码。余粮高级编程人员,Steve也许不会认可Jason采用的言法,但是无疑会建议在重写代码体系机构中使用某些模式。因此,整个团队都必须了解支付系弘的基础概念,而Jason要负责具体的实现。 2.问题与解决方案 本单前面曾经介绍过,设计模式是为了使用通用的解决方案来解决相同的问题而出现的。这部分说明覆盖了项目中的主要问题或各种问题,并且表明为何特定的设计模式是其中一个较好的解决方案。 读者也许注意到,本书并没有使用“最佳解决方案”的说法,其原因在于没有人能够给出这样的结论。即命名您发现所选择的设计模工是最适合于特定的问题,但是为了更理想地将期应用于具体的项目,您仍需要准备进行一定的改进工作。 3.UML图 UML图说明了设计模式的通用结构。在某些情况下,为了说明设计模式的其他实现或者以更易于理解的分段形式阐明复杂的概念,可能需要生成多个UML图。 > 什么是UML > > 统一建模语言(Unified Modeling Language,UML)图应当是编程工具库中的主要组成部分。UML是对操作、对像和用例进行图形编程的标准方式。在使用PHP构建复杂的软件时,UML图有助于清楚地表达您的设计。要最快地了解UML的最新信息,读者可以访问Wikipedia站点上的http://wikipedia.org/wiki/Unified_Modeling_Language 页面。 读者可能注意到,我们能够宽松地根据通用模式图给出用于为具体项目生成UML图的构建块。当然,与救命相对,方法名、类名和属性是多样公的,并且更加复杂。 4.代码示例 具有实际经验的PHP编程人员非常喜欢设计模式的最后一个主要部分:代码示例。这些相对简单的救命伤脑筋PHP代码表达设计模式的根念。本书介绍基于PHP的设计模式,其优点在于不必了解采用其他语言编写的模式示例 。侧重于企业级设计模式的其他书籍都是采用由Java或C语言编写的示例,对于使用单一语言的编程人员来说,示例效果稍有影响。 本书会不断地重申:代码示例只是例子,他们不能即插即用。代码示例可能不包含错误日志 记录或处理、审计或完全安全的编程技术。这并非表明我不欣赏高质量的、全安的编程(之前与我同一团队的编程人员可以证明我是一个注重细节的人),而是代码示例可以很好地说明我解释的概念。