游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

设计模式(五)行为型模式

  前言
  在上一篇结构型模式中,我们以功能为基本单位,研究了一些设计模式,用于实现功能转换、功能组合、功能封装等目的。
  我们知道,面向对象编程有两个核心元素:对象、对象间通信协作。从面向对象的角度看,任何系统和功能,都是由一个个对象,相互分工合作实现的。推而广之,很多系统也都是这样组织和运行的。
  本章的设计模式,列举了通用场景下常用功能机制的经典实现方法,讲解了经典实现中是如何高效组织对象、控制对象协作交互的,具有很好的参考价值。责任链模式
  示例:https:www。runoob。comdesignpatternchainofresponsibilitypattern。html原理说明
  责任链模式,就是把程序处理对象前后排列起来,形成一条处理线。处理线上需要被处理的信息,在处理线上向下传递,任何一个节点都可以随时中断传递。使用场景
  GUI系统中的事件传递机制(在Javascript中叫做事件冒泡),是责任链模式最典型的应用之一。
  当某一事件发生时,最顶层GUI对象会首先收到事件,但是它先不处理,而是依次交给命中的子GUI对象处理。当子GUI对象返回为False时,表示事件未被接收,此时父GUI对象才真正对发生的事件进行业务处理。
  可以看出,事件传递机制,是一种增强版的责任链模式,它的节点处理权,经历了向下和向上的双向传递过程。
  总结:当项目中一个数据对象,需要被多个处理对象进行处理时,可以将处理对象链接起来,然后把数据对象传递给头节点,随着处理的进行,数据对象的处理权会在处理链中流动,从而完成整个处理过程。使用须知
  责任链模式结构适用于需求固定的场景,用于实现简单高效的处理机制。假如需求不断变化,而且功能很复杂,那么用责任链模式很可能就无法胜任了,需要采用新的高复杂度的设计。例如,如果想要数据对象在所有处理对象中根据状态来实现跳转,可以选择使用状态机等其他方案来实现。本质
  责任链模式从本质上说,是一种简单的线性对象组织方式,优点是简单高效。它将处理对象封装集合在一起,实现对数据的集中处理,实现了处理对象的高内聚,降低了处理对象和数据对象的耦合。命令模式
  示例:https:www。runoob。comdesignpatterncommandpattern。html使用场景
  想要实现撤销、重做、事务等功能,可以使用此设计模式。通常在编辑器、数据库中有此类功能需求。原理说明
  命令也就是请求,或者叫调用。命令模式要求将请求参数和请求相关的方法封装在一起。
  请求对象中封装了实现撤销、重做、事务功能所需要的所有信息,实现了关联信息的高内聚,所以可以实现我们想要的功能。
  例如,可以在请求对象中保存修改之前的值、修改之后的值。利用修改之前的值,可以实现撤销功能;利用修改之后的值,可以实现重做功能。如果将所有请求对象都记录下来,并按照先后顺序排列起来,形成撤销重做堆栈,这样就可以实现连续的撤销、重做。事务则是撤销与重做的结合体,正常执行流程等同于重做,发生错误需要回滚,等同于撤销。
  如果不采用这种方式,会导致实现这些功能的信息,分散在源码中多个地方,或者已经丢失,没有保存,就无法实现撤销、重做、事务功能。
  同时,实现请求参数高内聚,也可以很方便地将它们保存到磁盘上,保存到文件的过程叫做序列化,从文件中读取的过程叫反序列化。这里的序列指的就是二进制流。
  Qt中与命令模式相关的部分是:UndoFramework,里面有示例项目,不熟悉的同学可以抽点时间看一看。本质
  命令模式的本质是,将请求相关的信息和操作封装在一起,实现信息的高度内聚,可以方便地实现撤销、重做、事务等功能。解释器模式
  示例:https:www。runoob。comdesignpatterninterpreterpattern。html原理说明
  顾名思义,解释器模式是用来实现解释器的。解释器是这样一个程序:解释器以符合语法的文本为输入,解释输入内容,完成一定的计算功能。文本可以在程序运行时动态加载,动态解释、动态执行。使用场景
  实现简单的解释器:命令行程序,如ping命令、cd命令等;实现复杂的解释器:脚本语言解释器,如python,lua,javascript;计算器。
  我们知道,在GUI图形用户界面被发明之前,人类和程序之间的交互是通过敲命令行实现的,缺点是使用难度较大,门槛较高。在GUI发明以后,交互更加友好,电脑更加易于使用了,所以也更加普及了。
  但是GUI交互的缺点在于,不够灵活,对参数的控制粒度不够细致。例如,现在大多数开发者都使用集成开发环境来开发软件,一般情况下都使用默认参数,比较方便。但是如果你想要更改某些编译选项,可能还是需要直接修改底层的编译命令。命令相对于GUI元素更加灵活,过于灵活的地方用GUI比较难于实现,例如组合、递归、跳转等等。在这些场景下,使用解释器是非常合适的。但是通常情况下,这个模式并不常用。本质
  解释器模式的本质是,它提出了一种基于文本的、比GUI更加灵活的对外提供功能服务的方式。为了实现这种交互功能,需要以命令文本为参数,把解释、执行的过程封装在解释器内部。迭代器模式
  示例:https:www。runoob。comdesignpatterniteratorpattern。html使用场景
  在需要多次遍历同一个数据集合的时候,为了少些一些for,或者想要把遍历过程封装起来,降低耦合,就可以使用迭代器模式。这个模式非常常用。原理说明
  迭代器就是一个专门用来遍历数组的类。它只需要实现两个接口:hasNext()、next()。hasNext()接口用于控制循环何时停止;next()接口用于取出当前位置的数据元素,并将遍历指针指向下一个元素。当然,构造迭代器对象的时候,需要将数据集合传递给迭代器,让迭代器知道要遍历哪些数据。
  原本需要用for循环来遍历的代码,现在通过封装,提取出了遍历这一功能所需要的必要信息,定义了两个接口,把不必要暴露的信息封装在了迭代器中,妥妥的实现了解耦。本质
  迭代器模式的本质是,为了更好地实现遍历功能,新建一个迭代器类专门封装底层的遍历过程,暴露两个简单的接口,实现遍历功能使用者和底层遍历过程的解耦。中介者模式
  示例:https:www。runoob。comdesignpatternmediatorpattern。html原理说明
  中介者模式是指,在原本直接通信的对象之间,添加一个通信中间层,使对象间通信变为间接通信,降低对象间的耦合。
  此模式和代理模式基本思想上是一致的。二者的区别是:代理模式是通过加一个中间层,来实现两个原本很难交互的功能主体,实现顺畅交互;中介者模式是为了降低对象间通信时的耦合而提出的,为的是提高代码的可维护性。使用场景
  比较大的项目中会用到,一般存在于某些框架中。因为大的项目中对象繁多,通信也比较复杂,适合使用中介者模式。
  在大的项目中,一般会有一个全局的通信管理器,任何对象都可以使用通信管理器提供的接口,将自己注册为某一个具有唯一ID消息的发送者和接收者。这样发送者只需要发送消息,不需要管谁来接收,不需要拥有发送者的实例指针,发出消息后,已注册的接收者都会收到消息。接收者不需要管信号是谁发的,即不需要拥有发送者的实例指针。
  所以,中介者模式也可以叫通信中介模式。本质
  中介者模式的本质是:对于信号接收者来说,中介者模式将信号发送者封装了起来;对信号发送者来说,中介者模式将信号接收者封装了起来,实现了通信双方的互相解耦。这是一种优化对象间通信协作的一种设计模式。备忘录模式
  示例:https:www。runoob。comdesignpatternmementopattern。html使用场景
  这个模式和状态存档功能是绑定在一起的。为了在程序中实现状态存档功能,可以使用备忘录模式。使用说明
  原例子中有三个类,个人觉得没有必要,这里我们简化成两个类,即备忘录模式中有两个类:状态对象类和状态对象管理类。状态对象类是状态字段是集合,并提供了存取接口;状态对象管理类负责组织和保存状态对象。当然实际实现中可以根据需求增加类,配合使用,完成状态保存恢复。本质
  备忘录模式专注于实现程序中状态的存档功能,它封装了状态的保存与恢复过程,使用者无需关心具体细节。观察者模式使用场景
  当一个对象会影响到其他多个对象时,即当对象间存在一对多关系时,使用观察者模式。一般应用于单向通知的场景,如GUI中鼠标事件、按键事件、窗口事件通知。使用Qt中的信号槽机制可以实现此模式。使用说明
  一是指发生变化的那个对象,多是指需要获取此变化通知的对象组。其中,变化消息是单向地由一到多传递的。如果不是单向的或者对象间不是一对多的关系,更加复杂,就需要重新思考其他对象间通信模型。
  如果不使用此模式,可能会导致观察者不能动态增加或删除;可能会造成发送者的业务代码和接收者的响应代码混在一起,耦合严重。
  使用此模式,需要为观察者设计一个基类,并设计一个接收通知的接口,所有观察者需要实现通知接口;所有观察者指针可以保存在队列中,实现动态增删。本质
  观察者模式本质是为了实现对象的一对多单向通信,是一种通信模式。它将消息发送者和接收者独立封装,实现了二者的解耦。状态模式使用场景
  状态模式用于实现状态机。如果一个程序功能中存在某些状态,在一定情况下,这些状态可以互相转换,并且在转换前后需要作出对应的操作,这种情况下使用状态机来实现就非常合适。使用说明
  如果不使用状态机(状态模式),一般的实现方法是使用一连串的ifelse,或者使用长长的switchcase来实现。这样做的缺点,一方面状态判断不够高效,另一方面是业务代码集中在一块,不好维护。
  使用状态机,每个状态都是一个类,相关的业务代码分布到各自的状态类中,能够实现不同的状态及与状态相关的业务代码解耦。同时某个状态和下一个状态是关联好的,在状态切换时,效率更高,不需要执行长长的判断。
  Qt中已实现状态机框架,TheStateMachineFramework,在此框架下,我们可以更加专注于业务实现,而不是状态机本身的技术细节。本质
  状态模式的本质是将不同的状态封装成不同的类,实现状态与状态间解耦。空对象模式
  示例:https:www。runoob。comdesignpatternnullobjectpattern。html使用场景
  使用基类保存子类对象通常有两种做法:用基类指针保存子类对象;用基类对象保存子类对象。
  第一种方法用指针是基本方法,但是指针用起来要非常小心,要考虑内存释放的问题。此时空对象就可以用空指针表示。第二种方法用基类对象保存子类对象,这种方法使用起来相对省心,不用与指针打交道,使用者不用直接管理内存。例如Qt中的QtXMLCClasses类的设计就是采用这种方式设计的。这种情况下,因为不使用指针,就需要使用空对象来代替空指针。使用说明
  可以仿造QtXML中的类进行设计。一般需要提供isNull()接口,对象类型转换接口等。本质
  空对象模式的本质是:使用对象化的形式,封装指针和内存操作,针对实现对象的保存,实现0指针设计,一般用在子类父类的设计中。策略模式使用场景
  策略模式和桥接模式类似,用于实现功能切换与组合。二者区别在于,策略模式专注于一个功能的不同实现方式;桥接模式专注于多个功能之间的组合。使用说明
  将功能抽象成单独的类,功能切换只需要切换不同的功能子类即可,同一个功能需要实现同一个功能接口。本质
  策略模式的本质是,保持功能接口不变,将不同的功能实现策略封装成子类,可以实现功能策略的切换。模板模式
  示例:https:www。runoob。comdesignpatterntemplatepattern。html使用说明
  模板模式应该是我们最熟悉的。这里的模板就是接口类,接口类定义了使用者和功能提供者之间交互的函数列表。子类负责功能的具体实现。本质
  模板模式的本质是:利用C的虚函数特性,使用接口将具体实现封装了起来,实现了功能对外接口和功能具体实现的解耦。访问者模式
  示例:https:www。runoob。comdesignpatternvisitorpattern。html使用场景
  访问者模式用于将数据结构与数据操作相分离。使用说明
  访问者模式和迭代器模式类似。迭代器模式一般用来遍历数组,所以没有把for封装起来。而访问者模式可以遍历一切类型的数据结构,具体的遍历过程被封装在接收者内部。同时,对每一个遍历得到的数组元素的操作,被封装在访问者内部。每一种对元素不同的操作,都需要新建一个访问者类。
  接收者需要实现accept()接口,访问者需要实现visit()接口。本质
  访问者模式的本质是,封装了数据遍历过程,同时也封装了数据操作过程,以一种高度封装的方式,实现了数据遍历操作功能。结语
  每种设计模式都有使用场景,都有优点和缺点。随着需求的改变,任何一种设计模式可能都将不再适用。
  本文原创首发于公众号Qt未来工程师。

本田S660告别应当体面,情怀从未改变本田公司于2021年3月12日宣布,将在明年3月停止生产KCar跑车S660,定位非常小众的S660在去年没有摆脱销量颓势,仅售出2747台。告别应当体面,为纪念这款小众……华为全屋智能战略再升级用三把钥匙打开未来家的大门华为全屋智能战略再升级用三把钥匙打开未来家的大门2021年10月23日,华为开发者大会2021(Together)如期在东莞松山湖举行,华为消费者BG首席战略官邵洋带来了……预售价38万,量产版即将发售,国产凯迪拉克Lyriq还会远吗近日,凯迪拉克在其官网上发布了一系列量产版纯电SUVLyriq的官图,并宣布了该车型在美国的预售时间。这意味着Lyriq的国产版车型离我们也不会太远了。量产版官图:与概念……下定就有国庆1400元现金红包,长安欧尚X7PLUS将于10近日,长安欧尚首款PLUS旗舰产品长安欧尚X7PLUS上市时间揭晓,新车将于10月17日正式上市,并推出7重预售豪礼2大金融置换2大现金红包的新车预定政策。新车金融置换政……快速轻巧,强大!3个下载神器,分分钟打造NAS下载机应广大网友的要求,笔者分章节把教程奉上!这个章节主要讲影音资源的下载,很多玩家想看4K电影,经常苦于找不到地方,无法下载。看完这一篇相信都会有了解。不管你是用的Windo……中国龙抵达上海,燃情一夏,助威奥运!伴着规律的鼓声团结一心整齐有力的划动着手中的船桨只为超越分秒前的自己这也是奥运精神完美诠释更快、更高、更强、更团结!7月31日8月1日山水相……英特尔开始在欧洲部署IDM2。0目标直指5nm到3nm制程自从PatGelsinger正式上任英特尔CEO以来,最大的动作莫过于启动IDM2。0。简单来说,IDM2。0就是重启晶圆厂狂魔模式,建造大量的晶圆厂,为英特尔自己以及代……Netflix在入华问题上已无能为力Netflix联合首席执行官ReedHastings在接受CNBC采访时表示,这家流媒体巨头近年来并没有试图进入中国市场,而是专注于全球其他地方的增长机会。几年前,我们被……RPA可以完全模拟人键鼠操作?很多企业已经开始引入RPA来解决公司运营的成本问题和日常重复性工作带来的工作效率低下的问题,RPA对人类劳动力的这种替换也引发了社会各界的广泛讨论,对这个问题的意见五花八门,但……适合学生,推荐初烧!天天动听TINHiFiT5DOC碳分子振近段时间天天动听出了不少有意思的耳机,尤其在千元价位段,对刚入门的学生群体尤为适合,一方面是价格亲民,性价比较高,另一方面调音的方向也相对正常正确,对刚入门的初烧而言,也能快速……语音转文字哪个好,这个语音转文字小程序用它就够了想必大家在工作生活中,有很多的录音文件与会议录音,经常使用录音,将录音进行整理,提取内容重点,编辑成文字稿又或是想将喜欢的视频中某个片段的语音提取转化出来,每次这些录音文件整理……OPPO三款新品齐发手表主打睡眠,K9Pro配置真香OPPOK9Pro每个安卓厂商在发布旗舰机的同时势必也会带来走量机,OPPO旗下的K系列凭借高性价比往往会在双十一、618等电商节中大放异彩。2021年9月26日17:00,O……
电动保时捷Taycan的销量超过911和特斯拉S型保时捷正在退出特斯拉,但比赛才刚刚开始。Taycan是保时捷的第一款电动车型。(保时捷)德国人汽车制造商电动Taycan模型线的销量超过了特斯拉S型而X在2021年……HUAWEIHiCar互联音频接续的2种情况HiCar小知识,有趣有用!〔比心〕今天小仙女来分享:HiCar互联音频接续的2种情况HiCar互联音频接续的2种情况:第一种当手机音乐正在播放的时候,……工资要上涨?10月起,统一按照新标准上调,3类人或将受益前段时间,网上爆出一份关于广州人均收入的调查数据,数据显示,广州人均收入在7000元左右,这个数字在年轻人中间掀起了轩然大波,很多网友抱怨说自己不配在广州,因为他们的薪资水平维……甘肃省86个区县汇总兰州市甘A城关区、七里河区、西固区、安宁区、红古区、榆中县、皋兰县、永登县嘉峪关市甘B峪泉镇、文殊镇、新城镇金昌市甘C金川区、永昌县白银市……分享一个有趣的库,让你学习C语言不会觉得那么枯燥前言以前刚学C语言的时候,跟着一位老师的教程用EasyX做了一个小游戏夜夜爱消除:文末可获取下载链接。EasyX简介EasyXGraphicsLibrary是……全第一!小米双11开门战报只要记得第一就对了今年的双11和往年有些不一样,今年从11。111。3为第一阶段的双11活动,当然很多厂商也拿出了自己的诚意,有些推出了新机,诸如RedmiK30S至尊纪念版,并且还给出了双11……中国能建与国家能源集团签订战略合作协议8月19日下午,中国能建与国家能源集团在京签订战略合作协议。中国能建党委书记、董事长宋海良与国家能源集团党组书记、董事长王祥喜见证签约并座谈交流。宋海良对国家能源集团给予……大朋VR连续三届蝉联中国VR50强软硬一体化布局全球B端市场声明:新闻稿非映维官方稿,法律问题一律与映维无关2021年10月19日,由江西省人民政府和工信部共同主办的2021世界VR产业大会在江西省南昌市正式启动。据介绍,本次大会……2020爱你爱你,我是时刻投影在你波心的优派新一代X10对于很多人来说,投影仪就是一个全新的家庭影院,而且用起来比电视更舒服,效果也更好。在慵懒的午后,煮上一壶清茶,或者泡上一杯咖啡,就可以窝在沙发里享受惬意的人生。一直都想入一台4……达到国际先进水平!杭氧四类产品通过中国通用机械协会鉴定9月2223日,由杭氧膨胀机公司自主研制的氢气透平膨胀机组、化工尾气透平膨胀机组与杭氧工装泵阀公司的轴承箱式高压多级低温离心泵、液氢液氦低温阀门等四类产品通过中国通用机械工业协……智能导航自动避障,家里清洁任务交给它准没错(本产品首发极果)感谢极果提供的inxni以内智能扫地机器人,有了扫地机器人的帮忙,地面卫生以后自己就不用费心了,机器人会认真的打扫干净,我呢可以有更多的时间陪老婆孩子。……海尔懂衣智能云镜,让理想智慧生活一镜启航近期,随青岛胶东国际机场正式转场运营,海尔智家三翼鸟机场体验中心精彩亮相。懂衣智能云镜作为智慧衣帽间的硬核产品,致力于成为智慧家庭第二屏。懂衣智能云镜是海尔衣联网打造的智……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网