范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

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

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

三星芯片清洗设备技术被盗卖,中国或早已攻克晶圆清洗机是半导体集成电路制造的四大设备之一,中国早已攻克了除光刻机以外的其他三种设备。随着2020年下半年开始的芯片短缺,对半导体的需求越来越强劲,包括中芯国际台积电三星Inte深夜,特斯拉车内突传女声我死得好冤,母女俩吓得弃车而逃!最新回应来了特斯拉又摊上事了?深夜,地下停车场,郑女士的双手长按在她的特斯拉MODEL3方向盘的两个按钮上,屏幕熄灭,系统进入重启程序。突然,黑色中控屏的屏幕上显示出一个绿色的麦克风,郑女士伸国际最新研究海草可能相当于一个巨型全球有机碳库中新网北京5月3日电(记者孙自法)施普林格自然旗下专业学术期刊自然生态与演化最新发表一项关于超甜海草的生态学研究论文,研究人员发现海草场底部蔗糖积累浓度约比此前海洋记录高出80倍。5月最新电脑配置推荐与方向装机建议前言在这段时间AN两家全系列独立显卡价格明显在下降,当然同型号不同品牌之间幅度也存在差异,英特尔全系列处理器价格也有所下调,我这边是不建议购买散片,如果你自己有合适的购买渠碎片时间学英语,听学测练听力熊英语学习机一机搞定当今网络多媒体时代,学生学习英语等学科知识再也不可能像我们家长这一代小时候时那样光啃书本哑巴英语模式的年代了,现在网络的多媒体资源才是真正取之不尽的知识宝库,而利用碎片时间提高英语全国数据中心行业消耗三峡电站全年的发电量双11大家都在对比各项数据时,却不知道这项业务消耗1个三峡电站的发电量,天猫京东双11战报中夹带了私货。大家在关注靓丽的销售数据时,很少人留意其中参杂的私货。天猫京东都纷纷表示,双告诉你联想中美差价的真实原因关于联想产品中美价格的差异我找到一篇内容分享给大家,希望能解决大家的疑惑,只是2015年的一篇内容,内容如下2015年3月10日,面对记者质疑为什么联想国内卖比美国贵,全国政协委员如果让你一天不用手机,你能做到吗?会是什么感觉?自从智能手机出现人们不需要了电视不需要了录音机,不需要了固定电话,天南海北,古今中外的境况尽纳眼底,手机成了全能的大餐点什么有什么,简直就是全球一卡通。如果一年不让用手机,可能像一听力不好带了助听器能像正常的听力吗?带了助听器达不到正常人的听力。助听器只是一种辅助的工具,帮助患者听到声音,能满足日常生活中的交流问题首先应请专业的验配人员测定其听力损失的程度,选配适宜的助听器,然后进行听力训练和有哪些游戏逼真到让你感觉置身其中?怎么说,感觉g还没老滚打上mod,感觉很真实。感觉没有一个游戏是好玩的别人说的神作我通通玩个遍不会超过一个小时再也不碰那个游戏了可能是我真的不适合玩游戏吧但是又想让游戏麻痹自己。冒vivo小米等十家企业启用。CN。中国国家顶级域名据ZAKER科技消息,4月12日,中国互联网络信息中心CNNIC官微发布消息称,近日,包括维沃公司(vivo手机。中国)小米科技(mi。中国小米科技有限责任公司。中国)通源集团(通
刚提车就让老婆当车模拍写真,80后游泳教练11。88万提自主高端SUV对于现在很多80后来说,每天的生活仅维持在两点一线中,几乎没有任何激情所言。因此,苦中作乐或许是对我们这一代人最大的慰藉。当然,每个人对于乐的认知不同,有些人喜欢打游戏,有些人喜欢享受积木拼装的乐趣和机械之美米兔积木机械动力今天带来的是来自米兔的米兔积木机械动力,这是我接触的第二款来自米兔的积木了,积木的品质非常优秀,同时也保持很好的性价比和可玩性,一套积木有多种拼装方案,还可以发挥自己的想象力组装成名门修谱王姓第一个皇帝,称帝后,修9座庙寻根家谱王姓作为中国大姓之一,人数之多甚至能够和李姓做对比。都知道,李姓皇帝多,但是王姓中,第一个皇帝就遭到百姓的唾弃,到底这个王姓第一位皇帝是如何称帝的呢?今天我们就一起来说说。王姓名门修谱陈氏历史传闻,用礼仪和制度教化子孙义门陈氏说起百家姓排行第五位的大姓陈姓,很多宗亲肯定会想到发源于江西德安县的义门陈氏。自宋初开宝年间至嘉祐七年,陈氏人口已经聚族三千九百余口切一十五代不分家的世界奇迹,世人皆称义门Lambda表达式与匿名内部类的内部实现区别在Java8提供Lambda表达式后,有些地方可以用比较简洁的Lambda表达式来代替原来相对冗余的匿名内部类了。那么Java在低层实现时,这2种方式有什么区别呢,下面通过例子来分哭笑不得!UDRP专家组误解域名生命周期新网域名资讯相信大家都知道域名是有一定时间限制的,如果到期后,你没有及时付费,这个域名将会不属于你,但是,域名如果不想要,到期后不续费就行了吗?宾夕法尼亚州立大学就是这么做的宾夕法最感人故事买上帝的小男孩20世纪初的一天,快到年底了,在美国西部的一座小城,一个十岁左右的小男孩捏着一枚1美元的硬币,沿街一家一家商店地询问请问,您这儿有上帝卖吗?店主要么说没有,要么认为他是在搞乱,不由梅醉还原自然健康果味,轻感微醉独具氛围感平时聚会一般白酒,红酒饮料为主打,随着现代人更具个性化,对健康的重视,饮品种类不仅更加丰富,很多饮品也更注重品质。梅酒这种传统饮品,经过改良也逐渐深受年轻人喜爱。佳能单反拍照效果如苹果iPhone12海外版其实都是双卡,国行版实体双卡的利与弊有网友反馈自己的苹果iPhone12手机是单卡,很显然这里的单卡是指自己的iPhone12只有一个实体的SIM卡卡槽,事实上国行港行都是双实体SIM卡槽。那这位网友所说的单卡苹果1四川男生丢脸了,顶级数学竞赛女生获奖率80且获唯一金奖成都七中高三女同学拿下顶级数学竞赛唯一金奖。阴盛阳衰,参赛5人就有4人获奖,并得到唯一一枚金牌,四川的女生比男生还牛。2021年首届丘成桐女子中学生数学竞赛颁奖仪式在清华大学附属中骁龙888也清凉,轻薄腾讯红魔游戏手机6R令人眼前一亮骁龙888的小伙伴儿阵营逐渐壮大,各类机型层出不穷。努比亚红魔6与红魔6Pro之前的游戏竞技特性就已经深受玩家喜爱。5月27日,再次发布新品西装狂魔腾讯红魔游戏手机6R。腾讯红魔游