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

目录

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

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

  • 针对请求者与执行者关系方面
    • 1对多 - 责任链模式 - 沿着这条链传递该请求,直到有一个对象处理它为止
    • 多对多、多对一 - 中介者模式 - 中介者使各对象不需要显式地相互引用
    • 一对一 - 命令模式 - 可用不同的请求对客户进行参数化
  • 针对执行者
    • 策略模式 - 使用不同的策略处理有不同的结果
    • 解释器模式 - 对请求语句进行解释
    • 状态模式 - 记录状态信息,状态的变更引起了行为的变更
    • 备忘录模式 - 保存记录信息/恢复记录信息
    • 迭代器模式 - 顺序访问的
    • 模板模式 - 预先定义好行为操作的模板
  • 针对执行者的追加操作
    • 访问者模式 - 某元素追加额外的操作,不影响原来的元素,不改变原来的行为操作下,也不改变元素结构情况下。
    • 观察者模式 - 观察执行者的执行动作的变化,并发送到多个观察者中。

1. 访问者模式

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

结构:访问者、追加额外元素、原本元素

个人笔记:
本来的执行操作是

visitor.handle(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. 中介者模式

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

个人笔记
与责任链模式不同的是:
责任链模式是有多个执行对象。
中介者模式是只有一个执行对象,不需要关注请求对象与执行对象是否一致问题。

例子:聊天室

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

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

相关文章

695. 岛屿的最大面积

695. 岛屿的最大面积 题目链接&#xff1a;695. 岛屿的最大面积 代码如下&#xff1a; class Solution { public:int maxAreaOfIsland(vector<vector<int>>& grid) {vector<vector<bool>> visited(grid.size(),vector<bool>(grid[0].size…

算法打卡day40

今日任务&#xff1a; 1&#xff09;139.单词拆分 2&#xff09;多重背包理论基础&#xff08;卡码网56携带矿石资源&#xff09; 3&#xff09;背包问题总结 4&#xff09;复习day15 139单词拆分 题目链接&#xff1a;139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; …

【Hive】自定义函数从编写到应用的整个流程(以UDF为例)

1. 编写UDF程序 以Java为例&#xff0c;编写一个字符串反转的函数&#xff08;工程依赖部分略&#xff09;&#xff1a; package com.example;import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hiv…

Pytorch学习笔记——TensorBoard的初使用

1、TensorBoard介绍 TensorBoard是TensorFlow的可视化工具&#xff0c;但它也可以与PyTorch结合使用。TensorBoard提供了一个Web界面&#xff0c;可以展示你训练过程中的各种信息&#xff0c;如损失值、准确度、权重分布等&#xff0c;更好地帮助开发者理解和调试模型。 Tenso…

huggingface里如何查看具体任务的评估指标

如果我们在做一个模型训练任务的时候&#xff0c;可能会不知道这个任务在评估的时候使用什么指标&#xff0c;那么huggingface里边为我们提供了参考&#xff1a; 下面就来看看吧&#xff1a; https://huggingface.co/https://huggingface.co/ 点击"Docs"&#xff…

【算法】【单调栈】【leetcode】1019. 链表中的下一个更大节点

刷这题之前先看&#xff1a; 【算法】【OD算法】【单调栈】找朋友-CSDN博客 【算法】【单调栈】【leetcode】1475. 商品折扣后的最终价格-CSDN博客 【算法】【单调栈】【leetcode】901. 股票价格跨度-CSDN博客 【算法】【单调栈】每日温度-CSDN博客 题目地址&#xff1…

嵌入式硬件中PCB走线与过孔的电流承载能力分析

简介 使用FR4敷铜板PCBA上各个器件之间的电气连接是通过其各层敷着的铜箔走线和过孔来实现的。 由于不同产品、不同模块电流大小不同,为实现各个功能,设计人员需要知道所设计的走线和过孔能否承载相应的电流,以实现产品的功能,防止过流时产品烧毁。 文中介绍设计和测试FR4敷…

iOS分享弹窗

klkxxy/分享菜单弹窗

抖音视频0粉营销推广墙纸,当日收益,第二天提现,日入300

项目简介&#xff1a; 这个项目非常易于执行&#xff0c;主要涉及在抖音平台上分享爱国主题的壁纸&#xff0c;并通过推广相关的小程序来实现盈利。 下 载 地 址 &#xff1a; laoa1.cn/1849.html 项目操作简便&#xff0c;一般只需花费1个小时即可完成&#xff0c;一旦掌…

【每日刷题】Day31

1. 2074. 反转偶数长度组的节点 - 力扣&#xff08;LeetCode&#xff09; //思路&#xff1a;双指针遍历。将链表存入数组中&#xff0c;通过双指针下标遍历定位需要反转的组。 typedef struct ListNode LN; void Reverse(int* arr,int left,int right)//反转函数 { while(left…

408数据结构-二叉树的概念、性质与存储结构 自学知识点整理

前置知识&#xff1a;树的基本概念与性质 二叉树的定义 二叉树是一种特殊的树形结构&#xff0c;其特点是每个结点至多只有两棵子树&#xff08;即二叉树中不存在度大于 2 2 2的结点&#xff09;&#xff0c;并且二叉树是有序树&#xff0c;左右子树不能互换。 与树类似&#…

探索和构建 LLaMA 3 架构:深入探讨组件、编码和推理技术(三)KV缓存

探索和构建 LLaMA 3 架构&#xff1a;深入探讨组件、编码和推理技术&#xff08;三&#xff09; KV缓存 在推理的每一步中&#xff0c;只对模型输出的最后一个标记感兴趣&#xff0c;因为已经有了之前的标记。然而&#xff0c;模型需要访问所有先前的标记来决定输出哪个标记&…

07 - 步骤 javaScript代码

简介 JavaScript 代码是通过 JavaScript 脚本步骤来执行 JavaScript 脚本的一种方式。这允许用户在 Kettle 的数据流程中使用 JavaScript 编写自定义的脚本逻辑&#xff0c;用于数据处理、转换、计算等操作。 使用 场景 我需要在数据流加一个字段 createTime 当前时间&…

java学习笔记12

21. System类和Runtime类 21.1 System类 System类定义了一些与系统相关的属性和方法,它所提供的属性和方法都是静态的,直接使用System类调用即可。System类的常用方法如下标所示: 方法名称功能描述static void exit(int status)终止jvm, status!=0表示异常终止jvmstatic vo…

《有限元分析及应用》《有限元分析基础教程》-曾攀-清华大学|pdf电子书+有限元分析及应用视频教程(全85讲) 曾攀、雷丽萍 ​​​+课件PPT

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

关于开源软件的影响力的探讨

开源软件的影响力 开源软件在软件开发领域中扮演着至关重要的角色&#xff0c;其影响力主要体现在以下几个方面&#xff1a; 开放源代码促进了全球开发者之间的协作和交流&#xff1a; 开源软件的源代码是公开可见的&#xff0c;这意味着任何人都可以查看、修改和分享代码。这…

找不到msvcr110.dll的多种解决方法,轻松解决dll问题

在日常使用计算机的时候&#xff0c;突然提示&#xff1a;“由于找不到msvcr110.dll&#xff0c;无法继续执行代码”。这个错误通常发生在运行某些程序时&#xff0c;系统无法找到所需的动态链接库文件。这个问题可能会给用户带来困扰&#xff0c;但是不用担心&#xff0c;下面…

Linux下运行jar包的方式

方式一&#xff1a;java -jar xx.jar 这样运行 java 程序遇到的问题就是&#xff0c;你不能在这个窗口进行其他操作&#xff0c;使用 CtrlC 就可以终止程序的执行&#xff0c;关闭 shell 窗口也会终止程序的执行。 方式二&#xff1a; java -jar XXX.jar & 关闭 xshell …

Codeforces Round 943 (Div. 3)

A O ( x ) O(x) O(x) 枚举即可&#xff0c;我也是这么做的&#xff0c;但是可以利用以下的性质来 O ( 1 ) O(1) O(1) 解决问题。 首先&#xff0c;gcd(a, b) gcd(a-b,b), 其中 a ≥ b a\geq b a≥b 其次&#xff0c;gcd(x,x-1)1, 其中 x ≥ 1 x\geq 1 x≥1 利用这两个性…

Golang 设计模式(行为型)

文章目录 策略模式迭代器模式访问者模式观察者模式命令模式模板方法模式责任链模式状态模式 策略模式 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装成独立的对象&#xff0c;使得它们可以互相替换。在 Go 语言中&#xff0c;策略…