热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式——行为型模式(二)

      行为型模式描述程序运行时的流程控制(复杂),主要是描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,其中包括了算法与对象间职责的分配。

       行为型模式和结构型模式一样,分为类和对象行为模式,类采用的继承机制来在类间分派行为,对象采用组合或聚合在对象间分配行为。因为组合关系或聚合关系比继承关系耦合度低,所以满足合成复用原则,所以对象行为模式比类行为模式具有更大的灵活性。

这篇博客介绍的行为性模式有:观察者模式、模板方法模式、命令模式、状态模式、职责链模式

一、解释器模式:提供如何定义语言的文法,以及对语言句子的解释方法。(类行为型模式)

设计模式——行为型模式(二)

适用情况:在软件开发中有些问题多次重复出现,而且有一定的相似和规律。如果将它们整理成一种简单的语言,那么这些问题实例就是该语言的一些句子。比如一些数据库语言的应用。

优点:扩展性好(可以通过继承等机制来改变或扩展文法)易实现(语法树中的每个表达式节点类都相似)

缺点:执行效率较低(解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢)引起类膨胀(每条规则至少需要定义一个类)

二、中介者模式:定义一个中介对象来简化原有对象的交互关系,降低对象间的耦合度,使原有对象之间不必相互了解。(对象行为型模式)​​

​​​​​设计模式——行为型模式(二)

适用情况:在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系一般是“网状结构”,它要求每个对象都必须知道它需要交互的对象。把“网状结构”改为“星形结构”(类似计算机网络拓扑结构星型)可以大大降低它们之间的“耦合性”,这时只需要定义一个“中介者”就可以了。比如在我们常用的“微信“中介者”就是微信服务器。

优点:降低了对象之间的耦合性,使得对象易于独立地被复用;把对象间的一对多关联转变为一对一的关联,使得系统易于维护和扩展。

缺点:当同级的类太多时,中介者会变得复杂而庞大,逻辑复杂以至于系统难以维护。

三、访问者模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式。(对象行为型模式​​​​​​​)​​

设计模式——行为型模式(二)

适用情况:在现实生活里有些集合对象中存在多种元素,且每种元素也存在多种不同的访问者和处理方式。比如,顾客在商场购物时放在“购物车”中的商品,顾客主要关心所选商品的性价比,而收银员关心的是商品的价格和数量。

优点:扩展性好(不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能);灵活性好(访问者模式将数据结构与作用于结构上的操作解耦)符合单一职责原则(访问者模式把相关的行为封装构成一个访问者,使每一个访问者的功能都比较单一)

缺点:增加新的元素类很困难,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。破坏封装,访问者模式中具体元素对访问者公布细节;违反了依赖倒置原则,访问者模式依赖了具体类,而没有依赖抽象类

四、策略模式:定义一系列算法各自封装起来,并使他们可相互替换,使算法可独立与它的客户变化。(对象行为型模式​​​​​​​)

设计模式——行为型模式(二)

适用情况:现实生活中经常遇到多种策略可供选择的情况。比如:出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、满减等方法。

优点:策略模式提供了一系列的可供重用的算法族,用继承可以把算法进行复用,从而避免重复的代码;符合对开闭原则,可以在不修改原代码的情况下,灵活增加新算法。

缺点:造成很多的策略类。

五、备忘录模式:不破坏封装的前提下,捕获一个对象内部状态保存,以后可以随时恢复(对象行为型模式​​​​​​​)

设计模式——行为型模式(二)

适用情况:很多应用软件都提供了这项功能,如 Word、记事本在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态。

优点:方便地将数据恢复到某个历史的状态;实现了内部状态的封装;发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则

缺点:资源消耗大

六、迭代器模式:提供一个方法顺序访问聚合对象中的元素,且不需暴露该对象的内部表示(对象行为型模式​​​​​​​)

设计模式——行为型模式(二)

适用情况:需要遍历一个集合,一个很常用的例子是foreace循环遍历

优点:方便地将数据恢复到某个历史的状态;实现了内部状态的封装;发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则

缺点:增加了类的个数,一定程度上增加了系统的复杂性。​​​​​​​


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
author-avatar
虚线老母阳
推荐一首歌《春风十里》,我的个人订阅号:虚线老母阳
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有