个人对行为型设计模式的理解 @by_TWJ
目录
- 1. 访问者模式
- 2. 迭代器模式
- 3. 观察者模式
- 4. 模板模式
- 5. 状态模式
- 6. 备忘录模式
- 7. 策略模式
- 8. 解释器模式
- 9. 责任链模式
- 10. 命令模式
- 11. 中介者模式
研究了一下,我为了方便理解,对它们进行了分类:
- 针对请求者与执行者关系方面
- 1对多 -
责任链模式- 沿着这条链传递该请求,直到有一个对象处理它为止 - 多对多、多对一 -
中介者模式- 中介者使各对象不需要显式地相互引用 - 一对一 -
命令模式- 可用不同的请求对客户进行参数化
- 1对多 -
- 针对执行者
策略模式- 使用不同的策略处理有不同的结果解释器模式- 对请求语句进行解释状态模式- 记录状态信息,状态的变更引起了行为的变更备忘录模式- 保存记录信息/恢复记录信息迭代器模式- 顺序访问的模板模式- 预先定义好行为操作的模板
- 针对执行者的追加操作
访问者模式- 某元素追加额外的操作,不影响原来的元素,不改变原来的行为操作下,也不改变元素结构情况下。观察者模式- 观察执行者的执行动作的变化,并发送到多个观察者中。
1. 访问者模式
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
结构:访问者、追加额外元素、原本元素
个人笔记:
本来的执行操作是
visitor.handle(ObjectStruture);
但为了不改变原来执行操作,也不改变现有对象结构下,进行追加操作,且保留了原来的结构。
做了如下修改:
元素类ObjectStruture 增加accept方法,并追加elementList
访问者增加visit方法,visit里添加 visitor.handle(ObjectStruture) ,保留原来的handle方法
元素类抽象化 - Element
追加的元素类:Element1、Element2
// 这是原本元素,追加了其他额外元素,通过add追加
public class ObjectStruture implements Element{private List<Element> elementList = new ArrayList<>();public void add(Element element){elementList.add(element);}public void accept(Visitor visitor) {for (Element element : elementList) {element.accept(visitor);}visitor.visit(this);}
}
// 访问者追加visit操作
public class Visitor {void visit(Element element){handle(element);}// 为了区分其他实现类不会追加,例如: element1.accept(new Visitor()) 不会进行追加操作。void visit(Element1 element1){System.out.println(element1.getClass().getName());}void handle(Element element){System.out.println(element.getClass().getName());}
}
public static void main(String[] args) {ObjectStruture objectStruture = new ObjectStruture();objectStruture.add(new Element1());objectStruture.add(new Element2());objectStruture.accept(new Visitor());
}
public interface Element {void accept(Visitor visitor);
}
这是用于二次开发的,用于对业务发生改变,请求参数变化,导致处理不适应原来的业务,所以这时就需要使用访问者模式,通过其他访问者,修正数据,以适应原来的业务操作。
2. 迭代器模式
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
典型例子:JAVA 中的 iterator。
3. 观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
4. 模板模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
5. 状态模式
状态模式的定义:当一个对象的内在状态改变时,允许其改变行为,这个对象看起来像是改变了其类。状态模式的核心是封装,状态的变更引起了行为的变更。
参考文章:https://blog.csdn.net/kris234seth/article/details/49684185
状态模式和状态是不同的概念,这个状态模式,行为会随着状态的改变而改变。
例如:1、画图工具的字体颜色,不同颜色写出来的字体颜色不同。2、连接请求,不同连接状态得到不同的结果。
特点:状态可变,固定行为,结果随状态改变而改变。
结构方面有三个部分:抽象状态类(State)(包含状态和行为)、状态实现类、环境类(Context)(包含行为)
* 抽象状态类* void setContext(Context context)* void 行为()
* 状态实现类
* 环境类* void setState(State state){state.setContext(this);this.state=state;}* void 行为(){this.state.行为()}
//画图工具的字体颜色,不同颜色写出来的字体颜色不同。
Context context = new Context();
context.setColor(new RedColorState());
String result = context.write("字体颜色");// 输出: [red]字体颜色
System.out.println(result);context.setColor(new GreenColorState());
String result2 = context.write("字体颜色");// 输出:[green]字体颜色
System.out.println(result2);
6. 备忘录模式
备忘录模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
参考文章:https://blog.csdn.net/weixin_45433817/article/details/131501970
例如:1、游览器的前进和后退操作。2、ps里的历史操作痕迹
特点:备忘录负责保存记录,负责人负责管理备忘录集合(包含保存备忘录和得到哪个备忘录),原发器负责创建备忘录,原发器就是原来事件本身
结构方面有三个部分:备忘录(Menento)、负责人(Caretaker)、原发者(Originator )
* 备忘录* void setContent(String content) * String getContent()
* 负责人* void add(Menento menento)* Menento get(int i)
* 原发者* Menento createMenento()* void recoveryFromMenento(Menento menento)
Originator originator = new Originator();//原发器,能创建备忘录
Caretaker caretaker = new Caretaker();//备忘录集合/负责人,负责看管备忘录originator.setMessage("第一页"); // 操作痕迹
caretaker.add(originator.createMenento()); // 保存痕迹到备忘录
originator.setMessage("第二页"); // 操作痕迹
caretaker.add(originator.createMenento()); // 保存痕迹到备忘录System.out.println("获取前一页记录:"+caretaker.get(-1)); // 获取前一个备忘录的痕迹 输出:获取前一页记录:Menento{source='第一页'}
//恢复备忘录
originator.recoveryFromMenento(caretaker.get(-1)); // 恢复前一个备忘录痕迹
System.out.println("恢复后:"+originator.getMessage());// 输出:恢复后:第一页
7. 策略模式
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
个人笔记:随着使用策略不同,返回不同结果
8. 解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
9. 责任链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
个人笔记
与命令模式不同的是:
责任链模式是,没有限制有多少实现。
命令模式是,一个请求只有一个实现。
public class FilterChain {List<Filter> filters = new ArrayList<Filter>();public void addFilter(Filter filter) {filters.add(filter);}public void doChain(String msg){//沿着这条链传递该请求,直到有一个对象处理它为止for(Filter filter : filters){boolean b = filter.doFilter(msg);// 直到有一个对象处理它为止if(b){return;}}}
}
10. 命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
个人笔记:
不同的请求执行不同的程序
与策略模式不同的是:
命令模式是不同的请求决定不同的结果
策略模式是不同的策略决定不同的结果
CommandProcessor processor = new CommandProcessor();
processor.add("ping",new CommandPing());
String result = processor.execute("ping 192.168.3.1");
System.out.println(result);
11. 中介者模式
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
个人笔记:
与责任链模式不同的是:
责任链模式是有多个执行对象。
中介者模式是只有一个执行对象,不需要关注请求对象与执行对象是否一致问题。
例子:聊天室
相关文章:
个人对行为型设计模式的理解 @by_TWJ
目录 1. 访问者模式2. 迭代器模式3. 观察者模式4. 模板模式5. 状态模式6. 备忘录模式7. 策略模式8. 解释器模式9. 责任链模式10. 命令模式11. 中介者模式 研究了一下,我为了方便理解,对它们进行了分类: 针对请求者与执行者关系方面 1对多 - 责…...
苹果挖走大量谷歌人才,建立神秘人工智能实验室;李飞飞创业成立「空间智能」公司丨 RTE 开发者日报 Vol.197
开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…...
行业唯一!易保全牵头编制的《区块链数据访问安全技术通则》发布
近日,易保全牵头参与编制的《区块链数据访问安全技术通则》经中国国际经济技术合作促进会正式发布,为中国区块链数据安全技术提供了标准参考。 易保全作为牵头起草单位、易保全CEO兼董事长刘刚担任主要起草人参与其中,在区块链技术安全风险…...
Rust Rocket创建第一个hello world的Web程序 Rust Rocket开发常用网址和Rust常用命令
一、Rust Rocket简介 Rust Rocket 是一个用 Rust 语言编写的 Web 应用框架,它结合了 Rust 的安全性和性能优势,以及 Web 开发的便利性。以下是 Rust Rocket 框架的一些优点: 安全性:Rust 是一种注重安全性的编程语言,…...
第G9周:ACGAN理论与实战
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制🚀 文章来源:K同学的学习圈子 上一周已经给出代码,需要可以跳转上一周的任务 第G8周:ACGAN任…...
Linux网络部分——DNS域名解析服务
目录 1. 域名结构 2. 系统根据域名查找IP地址的过程 3.DNS域名解析方式 4.DNS域名解析的工作原理【☆】 5.域名解析查询方式 6.搭建主从DNS域名服务器 ①初始化操作主服务器和从服务器,安装BIND软件 ②修改主服务器的主配置文件、区域配置文件、区域数…...
预处理详解
乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 点击主页:optimistic_chen和专栏:c语言, 创作不易,大佬们点赞鼓…...
Python的创建和使用自定义模块
Python 的模块是组织代码的基本单元,它可以包含变量、函数、类等,并且可以被其他 Python 程序引用和重用。除了使用 Python 提供的标准库和第三方库外,开发者还可以创建自定义模块,用于组织和管理自己的代码。本文将详细介绍如何创…...
Python根据预设txt生成“你画我猜”题目PPT(素拓活动小工具)
Python根据预设txt生成“你画我猜”题目PPT(素拓活动小工具) 场景来源 去年单位内部的一次素拓活动,分工负责策划设置其中的“你画我猜”环节,网络上搜集到题目文字后,想着如何快速做成对应一页一页的PPT。第一时间想…...
小程序地理位置接口权限直接抄作业
小程序地理位置接口有什么功能? 随着小程序生态的发展,越来越多的小程序开发者会通过官方提供的自带接口来给用户提供便捷的服务。但是当涉及到地理位置接口时,却经常遇到申请驳回的问题,反复修改也无法通过,给的理由也…...
【Osek网络管理测试】[TG3_TC6]等待总线睡眠状态_2
🙋♂️ 【Osek网络管理测试】系列💁♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果 1.环境搭建 硬件:VN1630 软件:CANoe 2.测试目的 验证DUT在满足进入等待睡眠状态的条件时是否进入该状态 …...
BEV下统一的多传感器融合框架 - FUTR3D
BEV下统一的多传感器融合框架 - FUTR3D 引言 在自动驾驶汽车或者移动机器人上,通常会配备许多种传感器,比如:光学相机、激光雷达、毫米波雷达等。由于不同传感器的数据形式不同,如RGB图像,点云等,不同模态…...
c#和python的flask接口的交互
一、灰度图像的传输 c#端的传输 //读入文件夹中的图像 Mat img2 new Mat(file, ImreadModes.AnyColor); //将图像的数据转换成和相机相同的buffer数据 byte[] image_buffer new byte[img2.Width * img2.Height]; int cn img2.Channels(); //通道数 if (cn 1){//将图像的数…...
Python测试框架Pytest的参数化详解
上篇博文介绍过,Pytest是目前比较成熟功能齐全的测试框架,使用率肯定也不断攀升。 在实际工作中,许多测试用例都是类似的重复,一个个写最后代码会显得很冗余。这里,我们来了解一下pytest.mark.parametrize装饰器&…...
KernelSU 如何不通过模块,直接修改系统分区
刚刚看了术哥发的视频,发现kernelSU通过挂载OverlayFS实现无需模块,即可直接修改系统分区,很是方便,并且安全性也很高,于是便有了这篇文章。 下面的教程与原视频存在差异,建议观看原视频后再结合本文章进行操作。 在未进行修改前,我们打开/system/文件夹,并在里面创建…...
红日靶场ATTCK 1通关攻略
环境 拓扑图 VM1 web服务器 win7(192.168.22.129,10.10.10.140) VM2 win2003(10.10.10.135) VM3 DC win2008(10.10.10.138) 环境搭建 win7: 设置内网两张网卡,开启…...
CellMarker | 人骨骼肌组织细胞Marker大全!~(强烈建议火速收藏!)
1写在前面 分享一下最近看到的2篇paper关于骨骼肌组织的细胞Marker,绝对的Atlas级好东西。👍 希望做单细胞的小伙伴觉得有用哦。😏 2常用marker(一) general_mrkrs <- c( MYH7, TNNT1, TNNT3, MYH1, MYH2, "C…...
游戏名台词大赏
文章目录 原神(圈内) 崩坏:星穹铁道(圈内) 崩坏3(圈内) 原神 只要不失去你的崇高,整个世界都会为你敞开。 总会有地上的生灵,敢于直面雷霆的威光。 谁也没有见过风&…...
OpenCV如何在图像中寻找轮廓(60)
返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何模板匹配(59) 下一篇 :OpenCV检测凸包(61) 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::findContours使用 OpenCV 函数 cv::d rawContours …...
java 泛型题目讲解
泛型的知识点 泛型仅存在于编译时期,编译期间JAVA将会使用Object类型代替泛型类型,在运行时期不存在泛型;且所有泛型实例共享一个泛型类 public class Main{public static void main(String[] args){ArrayList<String> list1new Arra…...
【开源鸿蒙Flutter跨平台开发实战复盘】从零到一:GitCode口袋工具项目构建全记录
1. 环境搭建:从零开始的跨平台开发之旅 作为一个有Android开发背景但完全没接触过Flutter的开发者,我最初面对开源鸿蒙和Flutter跨平台开发时也是一头雾水。环境搭建这个看似简单的第一步,就让我深刻体会到"万事开头难"的含义。 在…...
从音频生成到DNA分析:手把手带你用S4和Hyena搞定Transformer不擅长的那些长序列任务
从音频生成到DNA分析:手把手带你用S4和Hyena搞定Transformer不擅长的那些长序列任务 当我们需要处理长达数小时的音频波形、百万碱基对的DNA序列或整本小说级别的文本时,传统Transformer架构很快就会遇到计算瓶颈。本文将带您探索两种突破性的序列建模方…...
【英飞凌】TC3XX单片机型号解码:从命名规则看芯片选型
1. 英飞凌TC3XX单片机命名规则解析 第一次接触英飞凌TC3XX系列单片机时,我完全被那一长串型号搞懵了。TC387TP、TC377T、TC397QP...这些看似随机的字母数字组合,其实隐藏着丰富的芯片信息。经过几个项目的实战,我终于摸清了这套命名规则的规律…...
Rufus安装ubantu系统全过程
清水补充:这次安装的是ubantu22.04版本,准备来给两个电脑装,内存分配是分别是,微星老电脑是一个盘200G,/boot 使用1G,/swap 17G , 、/ 根目录90G,/home 文件目录96G ,实验…...
从逻辑门到CPU:计算机工作原理详解
戏说CPU的工作原理:从逻辑门到计算系统1. 计算系统的基本构建单元1.1 逻辑门的物理实现计算系统最基本的构建单元是逻辑门,它们可以通过简单的物理实体来演示。以三名士兵为例,我们可以构建最基本的逻辑运算单元:输入单元…...
用户缓冲区与内核缓冲区原理及应用解析
1. 用户缓冲区与内核缓冲区深度解析1.1 系统架构概述现代计算机系统采用分层架构设计,将运行环境划分为用户空间和内核空间两个关键区域。这种划分基于处理器提供的不同执行权限级别:用户空间:运行所有用户进程,包括应用程序、服务…...
OpenClaw定时任务:利用GLM-4.7-Flash实现智能日程管理
OpenClaw定时任务:利用GLM-4.7-Flash实现智能日程管理 1. 为什么需要智能化的定时任务 记得上个月我连续错过了三个重要会议,原因很简单——手动设置的日历提醒被其他通知淹没了。这种经历让我开始寻找更智能的解决方案。传统定时工具只能机械地执行预…...
MAX17332 Arduino库详解:单节锂电池燃料计量与独立充电控制
1. 项目概述 MAX17332 是 Maxim Integrated(现为 Analog Devices)推出的一款高度集成的单节锂离子/锂聚合物电池管理芯片,专为紧凑型便携设备设计。它并非传统意义上的“纯BMS”(Battery Management System)࿰…...
Vue3 的 JSX 函数组件,每次更新都会重新运行吗?
我用最直白、最无歧义、100%准确的方式,只回答你这一个问题: ✅ 最终答案(背它) 在 Vue3 中: 你写的 JSX 函数组件,整个函数 只会在组件初始化时运行 1 次! 更新时,整个函数 不会重新…...
3种方法让加密音乐重获自由:Unlock Music浏览器解密工具详解
3种方法让加密音乐重获自由:Unlock Music浏览器解密工具详解 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址:…...
