设计模式-11种行为型模式

行为型模式可以影响一个系统的状态和行为流。

责任链模式:

定义一个抽象处理者,其中包含了设置了下一个处理者和对请求的处理两个方法。具体的处理者都实现了这个接口。用于处理多级请,可以将多个处理者对象串联起来,每个处理者都有机会处理请求,直到某个处理者处理了该请求为止,不再给链上的下一个处理者为止。

应用场景,一个请求的处理,需要多个对象中的一个或若干个对象协作进行处理。

请求的处理者不知道下一个处理的请求对象是谁,链条顺序可以任意组合排序。

过滤器Filter类就用到了这种责任链模式。

命令模式:

用于将请求(调用者发出命令)或操作(命令的执行者执行命令)封装成一个对象。将命令和命令的执行者进行了分离,请求发送者不知道具体的执行者是谁。命令类commandClass维护了一个命令接收者/执行者的引用。

commandClass implements CommandInterface{

Receiver receiver;

Execute(){ receiver.action()}//命令类的执行方法其实是调用的具体执行者的方法。

}

(命令模式和代理、桥接等模式从持有一个中间者的结构上来说很相似,只是命令模式包括命令调用者,命令,命令执行者,解耦的是命令调用者和命令执行者之间通过命令来实现解耦,桥接模式是对接口和实现进行解耦)。

解释器模式(Interpreter):

它定义了一个语言的文法,并建立一个解释器来解释该语言中的句子。解释器模式的本质是分离实现,解释执行。它通过一个解释器对象处理一个语法规则的方式,把复杂的功能分离开,然后选择需要被执行的功能,并把这些功能组合成为需要被解释执行的抽象语法树,再按照抽象语法树来解释执行,实现相应的功能。(编译器将高级语言编译成计算机能识别的二进制其实也是一种解释器)

迭代器模式(Iterator):

它提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。迭代器模式为遍历的对象提供了一个统一的接口,使得用户只需要得到迭代器就可以进行遍历,而不用去关心遍历算法。JavaArrayList类提供了一个方法.Iterator()可以获取一个ArrayList内部的迭代器类private Class Itr implements Iterator

中介者模式(Mediator):

又叫作调解者模式或调停者模式。类之间的交互行为被统一放在中介者(Mediator)的对象中,对象通过中介者对象同其他对象交互,中介者对象起着控制器的作用,其他对象维护着一个中介者对象的引用并且提供与中介者之间发送和接收消息的接口。中介者模式用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互作用,从而降低耦合,而且可以独立地改变它们之间的交互。JMS,JNDI都是中介者模式中的中介者。

备忘录模式(Memento):

又叫快照模式。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。

游戏存档也是一种备忘录模式。

观察者模式(Observer):

定义了对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。在观察者模式中,一个目标物件管理所有相依于它的观察者物件(),并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。Java的锁机制有点观察者模式的味道(网上有说不是),线程竞争资源的时候,如果资源已被锁了,则添加进等待对列或者说观察者对列,锁释放后唤醒等待对列中的某一个线程。被唤醒的线程从等待对列中移除。

状态模式(State):

允许对象在内部状态变化时变更其行为,并且修改其类。根据不同状态来定位行为,或对象的行为依赖于其状态并必须在运行的时候根据状态修改,或具有大量取决于对象状态的条件语句时,可以使用状态模式。

策略模式(Strategy):

定义了一组能够用来表示可能行为的集合,不同策略有不同的行为。咋一看好像状态模式,不同状态有不同行为。策略模式下定义了不同策略的不同行为主要时为了复用,一般一个运行环境下,只选择一种特定的策略,而状态模式中主要关注的时行为随着状态的变化而变化,状态可能时经常变化的,并且可能是很多状态,而策略通常只有一个。例如我建立神经网络模型,底层有不同的算法。我们一遍选择了一个策略,那么整个运行期间就是一种算法了。

模板方法模式(Template Method):

提供了在不重写方法的前提下允许子类重载部分方法的方法。例如java的抽象类中,将不变的部分,封装成模板方法,子类可以直接使用,不需要重写。或者子类中的其他方法只需要部分重写,然后可以直接调用模板方法,减少代码重复

访问者模式(Visitor):

结构重点在于,每一个元素,都实现了接口的accept(Visitor visitor)方法,可以接收一个具体的(concrete)访问者。并且方法中,访问者会去执行访问这个元素的操作{visitor.visit(this)}具体的操作就由具体的访问者面对具体的元素的不同具体实现来确定了。使用了一种可维护的方法来表示在对象结构元素上要进行的操作。允许在不改变操作元素类的前提下定义一个新操作。定义新操作需要定义一个新的访问者,但是增加新元素就比较难了,每个访问者都要修改对新元素的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、验证1101序列(Moore)

题目要求: 用Moore型状态机验证1101序列。 题目描述: 用使用状态机验证1101序列,注意:允许重复子序列。如图 端口描述: module moore_1101(input clk,//时钟信号input clr,//reset复位信号,高电平有效in…

pdf处理工具 Enfocus PitStop Pro 2022 中文 for mac

Enfocus PitStop Pro 2022是一款专业的PDF预检和编辑软件,旨在帮助用户提高生产效率、确保印刷品质量并减少错误。以下是该软件的一些特色功能: PDF预检。PitStop Pro可以自动检测和修复常见的PDF文件问题,如缺失字体、图像分辨率低、颜色空…

在Android平板上使用code-server公网远程Ubuntu服务器编程

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以,这里以VMwhere ubuntu系统为例 下载code server服务,浏览器…

​EtherNet/IP 库卡机器人和EtherCAT倍福PLC总线协议连接案例​

EtherNet/IP 是一种适合于工业环境和对时间要求比较苛刻的应用的网络。而远创智控YC-EIPM-ECT通讯网关,是一款自主研发的EtherNet/IP 从站功能的通讯网关。它不仅可以实现EtherNet/IP 和EtherCAT的无缝连接,还可以将EtherNet/IP 作为从站连接到EtherCAT总…

嵌入式数据库sqlite3【基础篇】基本命令操作,小白一看就懂(C/C++)

目录 前言 一、sqlite概念和特性 二、sqlite安装 三、sqlite3数据类型 四、sqlite数据库约束 五、sqlite常用命令 六、SQL语句(增删改查) 七、sqlite使用实例(教学管理数据库) 总结 前言 数据在实际工作中应用非常广泛…

【LLM微调范式1】Prefix-Tuning: Optimizing Continuous Prompts for Generation

论文标题:Prefix-Tuning: Optimizing Continuous Prompts for Generation 论文作者:Xiang Lisa Li, Percy Liang 论文原文:https://arxiv.org/abs/2101.00190 论文出处:ACL 2021 论文被引:1588(2023/10/14&…

目录启示:使用 use 关键字为命名空间内的元素建立非限定名称

文章目录 参考环境三种名称非限定名称限定名称完全限定名称举个栗子 useuse 关键字use ... as .. 命名冲突真假美猴王两个世界 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型、ChatGPTPHP 官方PHP ManualPHP 官方language.namespaces.ra…

HTML复习笔记

HTML(超文本标记语言) 文章目录 HTML(超文本标记语言)1.HTML1.概念2.标签2.1双标签超链接音频标签视频标签无序列表有序列表定义列表表格合并单元格 表单表单项单选框-**radio**文件上传-file多选框-checkbox 下拉菜单文本域-text…

Unity 3D视频教程

上一篇:各种品牌汽车车标 记录了一些车标。 在懂车帝App上,会有3D看车功能。最近发现一个Unity 3D的视频教程,分享下! https://www.bilibili.com/video/BV1TZ4y1o76s/

JavaSE学习值之--认识异常

💕"有效知识的前提是承认知识边界,承认我们对边界那边的一切无可奉告。"💕 作者:Mylvzi 文章主要内容:JavaSE学习值之--认识异常 一.什么是异常? 异常就是程序在运行的时候产生的不正常的行为 …

linux上构建任意版本的rocketmq多架构x86 arm镜像——筑梦之路

现状 目前市面上和官方均只有rocketmq x86架构下的docker镜像,而随着国产化和信创适配的需求越来越多,显然现有的x86架构下的docker镜像不能满足多样化的需求,因此我们需要根据官方发布的版本制作满足需求的多架构镜像,以在不同cp…

Ubuntu的Python从2.x升级到3.x

我的Ubuntu系统默认是2.7,我想升级为3.5 升级python3.5 下载python sudo apt-get install python3查看 刚才下载的Python程序被安装在usr/local/lib/python3.5 中 cd usr/local/lib备份一下 sudo cp /usr/bin/python /usr/bin/python_bak删除python的旧关联 sudo rm -rf py…

Linux网络编程系列之网络编程基础

Linux网络编程系列 (够吃,管饱) 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

如何降低海康、大华等网络摄像头调用的高延迟问题(二)

目录 1.RTSP介绍 2.解决办法1 3.解决办法2 1.RTSP介绍 RTSP(Real-time Streaming Protocol)是一种用于实时流媒体传输的网络协议。它被设计用于在服务器和客户端之间传输音频、视频以及其他流媒体数据。 RTSP协议允许客户端通过与服务器建立RTSP会话…

Easysearch压缩模式深度比较:ZSTD+source_reuse的优势分析

引言 在使用 Easysearch 时,如何在存储和查询性能之间找到平衡是一个常见的挑战。Easysearch 具备多种压缩模式,各有千秋。本文将重点探讨一种特别的压缩模式:zstd source_reuse,我们最近重新优化了 source_reuse,使得它在吞吐量…

【linux】日志和journalctl 管理查看日志

目录 既看即用 简略介绍 linux的日志类型 系统日志 介绍 区别的简单说明 区别的详细说明 journalctl是什么?(查看系统日志的工具) 详细内容 linux的日志类型 systemd日志(systemd-journald) 放在哪个目录 …

Linux系统编程详解

Linux 多线程编程 什么是线程? 与线程类似,线程是允许应用程序并发执行多个任务的一种机制 线程是轻量级的进程(LWP:Light Weight Process),在 Linux 环境下线程的本 质仍是进程。 一个进程可以包含多个线…

D. Divide and Equalize--Codeforces Round 903 (Div. 3)

D. Divide and Equalize 题意:让一组数中的一个数除以一个因子,一个数除以一个因子,假如经过若干次操作后能够使数组所有数相等,那么输出YES,否则输出NO。 分析:乘除因子,那么实际上就是因子的…

[ROS2系列] ubuntu 20.04测试rtabmap 3D建图(二)

接上文我们继续 如果我们要在仿真环境中进行测试&#xff0c;需要将摄像头配置成功。 一、配置位置 sudo vim /opt/ros/foxy/share/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf 二、修改 <joint name"camera_rgb_optical_joint" type"fixed&…

【Rust笔记】Rust与Java交互-JNI模块编写-实践总结

近期工作中有Rust和Java互相调用需求&#xff0c;这篇文章主要介绍如何用Rust通过JNI和Java进行交互&#xff0c;还有记录一下开发过程中遇到的一些坑。 JNI简单来说是一套Java与其他语言互相调用的标准&#xff0c;主要是C语言&#xff0c;官方也提供了基于C的C接口。 既然是C…