当前位置: 首页 > news >正文

个人对行为型设计模式的理解 @by_TWJ

目录

  • 1. 访问者模式
  • 2. 迭代器模式
  • 3. 观察者模式
  • 4. 模板模式
  • 5. 状态模式
  • 6. 备忘录模式
  • 7. 策略模式
  • 8. 解释器模式
  • 9. 责任链模式
  • 10. 命令模式
  • 11. 中介者模式

研究了一下,我为了方便理解,对它们进行了分类:

  • 针对请求者与执行者关系方面
    • 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. 中介者模式 研究了一下&#xff0c;我为了方便理解&#xff0c;对它们进行了分类&#xff1a; 针对请求者与执行者关系方面 1对多 - 责…...

苹果挖走大量谷歌人才,建立神秘人工智能实验室;李飞飞创业成立「空间智能」公司丨 RTE 开发者日报 Vol.197

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…...

行业唯一!易保全牵头编制的《区块链数据访问安全技术通则》发布

近日&#xff0c;易保全牵头参与编制的《区块链数据访问安全技术通则》经中国国际经济技术合作促进会正式发布&#xff0c;为中国区块链数据安全技术提供了标准参考。 易保全作为牵头起草单位、易保全CEO兼董事长刘刚担任主要起草人参与其中&#xff0c;在区块链技术安全风险…...

Rust Rocket创建第一个hello world的Web程序 Rust Rocket开发常用网址和Rust常用命令

一、Rust Rocket简介 Rust Rocket 是一个用 Rust 语言编写的 Web 应用框架&#xff0c;它结合了 Rust 的安全性和性能优势&#xff0c;以及 Web 开发的便利性。以下是 Rust Rocket 框架的一些优点&#xff1a; 安全性&#xff1a;Rust 是一种注重安全性的编程语言&#xff0c;…...

第G9周:ACGAN理论与实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 上一周已经给出代码&#xff0c;需要可以跳转上一周的任务 第G8周&#xff1a;ACGAN任…...

Linux网络部分——DNS域名解析服务

目录 1. 域名结构 2. 系统根据域名查找IP地址的过程 3.DNS域名解析方式 4.DNS域名解析的工作原理【☆】 5.域名解析查询方式 6.搭建主从DNS域名服务器 ①初始化操作主服务器和从服务器&#xff0c;安装BIND软件 ②修改主服务器的主配置文件、区域配置文件、区域数…...

预处理详解

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…...

Python的创建和使用自定义模块

Python 的模块是组织代码的基本单元&#xff0c;它可以包含变量、函数、类等&#xff0c;并且可以被其他 Python 程序引用和重用。除了使用 Python 提供的标准库和第三方库外&#xff0c;开发者还可以创建自定义模块&#xff0c;用于组织和管理自己的代码。本文将详细介绍如何创…...

Python根据预设txt生成“你画我猜”题目PPT(素拓活动小工具)

Python根据预设txt生成“你画我猜”题目PPT&#xff08;素拓活动小工具&#xff09; 场景来源 去年单位内部的一次素拓活动&#xff0c;分工负责策划设置其中的“你画我猜”环节&#xff0c;网络上搜集到题目文字后&#xff0c;想着如何快速做成对应一页一页的PPT。第一时间想…...

小程序地理位置接口权限直接抄作业

小程序地理位置接口有什么功能&#xff1f; 随着小程序生态的发展&#xff0c;越来越多的小程序开发者会通过官方提供的自带接口来给用户提供便捷的服务。但是当涉及到地理位置接口时&#xff0c;却经常遇到申请驳回的问题&#xff0c;反复修改也无法通过&#xff0c;给的理由也…...

【Osek网络管理测试】[TG3_TC6]等待总线睡眠状态_2

&#x1f64b;‍♂️ 【Osek网络管理测试】系列&#x1f481;‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果 1.环境搭建 硬件&#xff1a;VN1630 软件&#xff1a;CANoe 2.测试目的 验证DUT在满足进入等待睡眠状态的条件时是否进入该状态 …...

BEV下统一的多传感器融合框架 - FUTR3D

BEV下统一的多传感器融合框架 - FUTR3D 引言 在自动驾驶汽车或者移动机器人上&#xff0c;通常会配备许多种传感器&#xff0c;比如&#xff1a;光学相机、激光雷达、毫米波雷达等。由于不同传感器的数据形式不同&#xff0c;如RGB图像&#xff0c;点云等&#xff0c;不同模态…...

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的参数化详解

上篇博文介绍过&#xff0c;Pytest是目前比较成熟功能齐全的测试框架&#xff0c;使用率肯定也不断攀升。 在实际工作中&#xff0c;许多测试用例都是类似的重复&#xff0c;一个个写最后代码会显得很冗余。这里&#xff0c;我们来了解一下pytest.mark.parametrize装饰器&…...

KernelSU 如何不通过模块,直接修改系统分区

刚刚看了术哥发的视频,发现kernelSU通过挂载OverlayFS实现无需模块,即可直接修改系统分区,很是方便,并且安全性也很高,于是便有了这篇文章。 下面的教程与原视频存在差异,建议观看原视频后再结合本文章进行操作。 在未进行修改前,我们打开/system/文件夹,并在里面创建…...

红日靶场ATTCK 1通关攻略

环境 拓扑图 VM1 web服务器 win7&#xff08;192.168.22.129&#xff0c;10.10.10.140&#xff09; VM2 win2003&#xff08;10.10.10.135&#xff09; VM3 DC win2008&#xff08;10.10.10.138&#xff09; 环境搭建 win7&#xff1a; 设置内网两张网卡&#xff0c;开启…...

CellMarker | 人骨骼肌组织细胞Marker大全!~(强烈建议火速收藏!)

1写在前面 分享一下最近看到的2篇paper关于骨骼肌组织的细胞Marker&#xff0c;绝对的Atlas级好东西。&#x1f44d; 希望做单细胞的小伙伴觉得有用哦。&#x1f60f; 2常用marker&#xff08;一&#xff09; general_mrkrs <- c( MYH7, TNNT1, TNNT3, MYH1, MYH2, "C…...

游戏名台词大赏

文章目录 原神&#xff08;圈内&#xff09; 崩坏&#xff1a;星穹铁道&#xff08;圈内&#xff09; 崩坏3&#xff08;圈内&#xff09; 原神 只要不失去你的崇高&#xff0c;整个世界都会为你敞开。 总会有地上的生灵&#xff0c;敢于直面雷霆的威光。 谁也没有见过风&…...

OpenCV如何在图像中寻找轮廓(60)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何模板匹配(59) 下一篇 :OpenCV检测凸包(61) 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::findContours使用 OpenCV 函数 cv::d rawContours …...

java 泛型题目讲解

泛型的知识点 泛型仅存在于编译时期&#xff0c;编译期间JAVA将会使用Object类型代替泛型类型&#xff0c;在运行时期不存在泛型&#xff1b;且所有泛型实例共享一个泛型类 public class Main{public static void main(String[] args){ArrayList<String> list1new Arra…...

pptx 文件版面分析-- python-pptx(python 文档解析提取)

安装 pip install python-pptx -i https://pypi.tuna.tsinghua.edu.cn/simple --ignore-installedpptx 解析代码实现 from pptx import Presentation file_name "rag_pptx/test1.pptx" # 打开.pptx文件 ppt Presentation(file_name) for slide in ppt.slides:#pr…...

http的basic 认证方式

写在前面 本文看下http的basic auth认证方式。 1&#xff1a;什么是basic auth认证 basic auth是一种http协议规范中的一种认证方式&#xff0c;即一种证明你就是你的方式。更进一步的它是一种规范&#xff0c;这种规范是这样子&#xff0c;如果是服务端使用了basic auth认证…...

【信息系统项目管理师练习题】信息系统治理

IT治理的核心是关注以下哪项内容? a) 人员培训和发展计划 b) IT定位和信息化建设与数字化转型的责权利划分 c) 业务流程的绩效管理 d) IT基础设施的优化利用 答案: b) IT定位和信息化建设与数字化转型的责权利划分 IT治理体系框架的组成部分包括以下哪些? a) IT战略目标、IT治…...

RabbitMQ之顺序消费

什么是顺序消费 例如&#xff1a;业务上产生者发送三条消息&#xff0c; 分别是对同一条数据的增加、修改、删除操作&#xff0c; 如果没有保证顺序消费&#xff0c;执行顺序可能变成删除、修改、增加&#xff0c;这就乱了。 如何保证顺序性 一般我们讨论如何保证消息的顺序性&…...

轻松上手的LangChain学习说明书

一、Langchain是什么&#xff1f; 如今各类AI模型层出不穷&#xff0c;百花齐放&#xff0c;大佬们开发的速度永远遥遥领先于学习者的学习速度。。为了解放生产力&#xff0c;不让应用层开发人员受限于各语言模型的生产部署中…LangChain横空出世界。 Langchain可以说是现阶段…...

【论文笔记】Training language models to follow instructions with human feedback A部分

Training language models to follow instructions with human feedback A 部分 回顾一下第一代 GPT-1 &#xff1a; 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式&#xff1b;模型架构是基于 Transformer 的叠加解码器&#xff08;掩码自注意…...

嵌入式交叉编译:x265

下载 multicoreware / x265_git / Downloads — Bitbucket 解压编译 BUILD_DIR${HOME}/build_libs CROSS_NAMEaarch64-mix210-linuxcd build/aarch64-linuxmake cleancmake \-G "Unix Makefiles" \-DCMAKE_C_COMPILER${CROSS_NAME}-gcc \-DCMAKE_CXX_COMPILER${CR…...

一、Redis五种常用数据类型

Redis优势&#xff1a; 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用&#xff0c;3种高级 3、原子—redis的所有单个操作都是原子性&#xff0c;即要么成功&#xff0c;要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点&#xff1a; 1、支持…...

C语言动态内存管理malloc、calloc、realloc、free函数、内存泄漏、动态内存开辟的位置等的介绍

文章目录 前言一、为什么存在动态内存管理二、动态内存函数的介绍1. malloc函数2. 内存泄漏3. 动态内存开辟位置4. free函数5. calloc 函数6. realloc 函数7. realloc 传空指针 总结 前言 C语言动态内存管理malloc、calloc、realloc、free函数、内存泄漏、动态内存开辟的位置等…...

最近惊爆谷歌裁员

Python团队还没解散完&#xff0c;谷歌又对Flutter、Dart动手了。 什么原因呢&#xff0c;猜测啊。 谷歌裁员Python的具体原因可能是因为公司在进行技术栈的调整和优化。Python作为一种脚本语言&#xff0c;在某些情况下可能无法提供足够的性能或者扩展性&#xff0c;尤其是在…...

自己建立网站的方法/优化大师win7官方免费下载

无论谁在使用电脑的时候都可能会发现搭建Python 3.5.2开发环境进行设置。很多对电脑不太熟悉的小伙伴不知道win10系统搭建Python 3.5.2开发环境到底该如何设置&#xff1f;其实win10系统搭建Python 3.5.2开发环境有什么简便的处理方式呢&#xff0c;其实只要依照1、首先从Pytho…...

wordpress 清除/抖音指数

定义&#xff1a;定义一系列算法&#xff0c;将它们一个个封装起来&#xff0c;并且使他们之间可以相互替换。本模式使得算法可以独立于使用它的客户而变化。 类型&#xff1a;对象行为型模式 类图&#xff1a; 策略模式是对算法的封装&#xff0c;把一系列的算法分别封装到对应…...

微信运营公司/seo优化培训课程

一、简述 通过构造性能良好的哈希函数&#xff0c;可以减少冲突&#xff0c;但一般不可能完全避免冲突&#xff0c;因此解决冲突是哈希法的另一个关键问题。创建哈希表和查找哈希表都会遇到冲突&#xff0c;两种情况下解决冲突的方法应该一致。 二、拉链法 基本思想是将所有…...

淘客帝国 wordpress/爱站seo工具包官网

这是 利用Excel学习Python 系列的第8篇文章想用一个完整的案例讲解Python数据分析的整个流程和基础知识&#xff0c;实际上以一个数据集为例&#xff0c;数据集是天池上的一个短租数据集&#xff0c;后台回复&#xff1a;短租数据集&#xff0c;即可获得。先来想一下数据分析的…...

雄安智能网站建设电话/企业宣传片

位运算符&#xff08;内存中的位数进行操作&#xff0c;二进制比特位比一般语法乘2要快一些&#xff09;&#xff1a;优化我们的算法&#xff0c;提高我们的效率。 位于&#xff1a;& 位或&#xff1a;| 异或&#xff1a;^ 相异得1&#xff0c;相同得0 位非&#xff1a;~ …...

酒店网站开发合同/电商网站前端页面内容编写

曾经沧海难为水 信息如水 压力如潮 功能实现阶段&#xff0c;我们对得要处理的信息分析得很细致&#xff0c;很透彻&#xff0c;所谓细如丝&#xff0c;透如水。然而&#xff0c;到了产品的阶段&#xff0c;要处理的信息却如同潮洪而至&#xff0c;原本的假设预想&#xff0c;通…...