行为型模式-命令-迭代-观察者-策略

news2024/11/27 2:50:00

命令模式

是什么

将一个请求封装成为一个对象,
从而可以使用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及可以撤销的操作

实例

在这里插入图片描述

在这里插入图片描述

请求封装成为对象

//用来声明执行操作的接口  
public abstract class Command {  
protected Receiver receiver;  
  
public Command(Receiver receiver){  
this.receiver=receiver;  
}  
  
//执行命令  
abstract public void excuteCommand();  
}  
  
//具体操作类  
class FengCommand extends Command{  
public FengCommand(Receiver receiver) {  
super(receiver);  
}  
  
@Override  
public void excuteCommand() {  
receiver.fengzhan();  
}  
}  
  
class DengCommand extends Command{  
public DengCommand(Receiver receiver) {  
super(receiver);  
}  
  
@Override  
public void excuteCommand() {  
receiver.deng();  
}  
}

迭代器模式

是什么

提供一种方法顺序访问一个聚合对象中的各个元素
又不暴露该对象的内部表示

实例

在这里插入图片描述

在这里插入图片描述

观察者模式

是什么

又叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当这个主题对象的状态发生变化的时候,会通知所有的观察者对象,使得他们可以自己自动更新自己

实例

在这里插入图片描述

在这里插入图片描述

class Cat implements Subject {  
private List<Observer> observers;  
private boolean isShouting;  
  
public Cat() {  
observers = new ArrayList<>();  
isShouting = false;  
}  
  
@Override  
public void registerObserver(Observer observer) {  
observers.add(observer);  
}  
  
@Override  
public void removeObserver(Observer observer) {  
observers.remove(observer);  
}  
  
@Override  
public void notifyObservers() {  
for (Observer observer : observers) {  
observer.update("猫叫");  
}  
}  
  
// 模拟猫大叫的方法  
public void shout() {  
isShouting = true;  
System.out.println("猫叫!");  
notifyObservers();  
}  
}

策略模式

是什么

定义算法家族,分别封装,让他们之间而言互相替换,此模式让算法的变化不会影响到使用算法的客户

实例

在这里插入图片描述

在这里插入图片描述

class Context {  
  
Strategy strategy;  
//初始化时,传入具体的策略对象  
public Context(Strategy strategy)  
{  
this.strategy=strategy;  
}  
  
//根据具体的策略对象,调用方法  
public void encrypt()  
{  
strategy.encrypt();  
}  
  
}

总结

相同点

  1. 行为型模式:它们都属于行为型设计模式,专注于对象之间的交互和通信。
  2. 提高扩展性:这些模式都能在一定程度上提高系统的扩展性和可维护性,通过引入抽象层或接口,使得新的实现可以更容易地被添加和替换。

不同点

  1. 关注点

    • 命令模式:关注的是解耦问题,特别是请求者和执行者之间的解耦。通过封装请求为命令对象,可以实现请求的排队、撤销和恢复等操作。
    • 迭代器模式:关注的是集合对象的遍历行为,提供了一种在不暴露集合底层表示的情况下顺序访问集合元素的方法。
    • 观察者模式:定义了一种一对多的依赖关系,当被观察对象状态改变时,所有观察者都会收到通知。它建立了一套触发机制,使得对象之间的交互更加灵活。
    • 策略模式:关注的是算法的自由切换和封装,使得算法的变化独立于使用算法的客户。通过定义一系列算法,并将它们封装为可互换的策略对象,使得算法的变化不会影响到客户端代码。
  2. 结构

    • 命令模式:包含命令接口、具体命令类、接收者类和调用者类。命令接口定义了执行命令的方法,具体命令类实现了这个接口并指定了接收者。接收者类负责执行具体的操作,调用者类则通过命令对象来间接调用接收者的方法。
    • 迭代器模式:包含迭代器接口、具体迭代器类和可迭代对象接口(有时为具体可迭代对象)。迭代器接口定义了遍历集合元素的方法,具体迭代器类实现了这个接口并持有一个指向当前元素的引用。可迭代对象接口定义了创建迭代器的方法。
    • 观察者模式:包含主题接口、具体主题类和观察者接口(有时为具体观察者类)。主题接口定义了注册、移除和通知观察者的方法,具体主题类实现了这个接口并维护了一个观察者列表。观察者接口定义了更新方法,具体观察者类实现了这个方法以响应主题状态的变化。
    • 策略模式:包含策略接口和具体策略类。策略接口定义了算法的共同行为,具体策略类实现了这个接口并提供了具体的算法实现。客户端代码通过策略接口来调用具体的算法。
  3. 应用场景

    • 命令模式:适用于需要将请求调用者和请求接受者解耦的场景,或者需要支持命令的撤销和恢复操作的场景。
    • 迭代器模式:适用于需要遍历集合元素的场景,特别是当集合的内部表示可能发生变化时。
    • 观察者模式:适用于当一个对象的状态改变时,需要通知其他对象的场景。它建立了一种一对多的依赖关系,使得对象之间的交互更加灵活和动态。
    • 策略模式:适用于算法要求变换的场景,或者需要封装多个不同算法的场景。通过策略模式,可以方便地切换不同的算法,而不会影响到客户端代码。
  4. 优缺点

    • 命令模式:优点包括降低了系统的耦合度、易于添加新的命令、支持命令队列和撤销恢复操作等;缺点是可能导致过多的具体命令类。
    • 迭代器模式:优点包括简化集合遍历、隐藏内部实现、支持多种遍历方式和简化客户端代码等;缺点是增加了类的数量、可能不适合简单集合以及存在一定的性能开销。
    • 观察者模式:优点包括观察者和被观察者是抽象耦合的、建立一套触发机制等;缺点是通知所有观察者可能会花费很多时间、循环依赖可能导致系统崩溃以及没有机制让观察者知道目标对象是如何变化的。
    • 策略模式:优点包括算法独立、易于管理、易于扩展和符合开闭原则等;缺点是客户端必须知道所有的策略类并自行决定使用哪一个策略类。

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

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

相关文章

【网络原理】Udp报文结构,保姆级详解,建议收藏

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 一、UDP报文格式 ​ ​ 可以看出UDP报文主要由报头和正文两部分构成&#xff0c;报头存储了此次报文的一些重要信息&#xff0c;而正文才是真正需要传输的内容。本篇文章就主要…

【Kubernetes】常见面试题汇总(五十二)

目录 116. K8S 集群服务暴露失败&#xff1f; 117.外网无法访问 K8S 集群提供的服务&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-…

Windows 环境上安装 NASM 和 YASM 教程

NASM 和 YASM NASM NASM&#xff08;Netwide Assembler&#xff09;是一个开源的、可移植的汇编器&#xff0c;它支持多种平台和操作系统。它可以用来编写16位、32位以及64位的代码&#xff0c;并且支持多种输出格式&#xff0c;包括ELF、COFF、OMF、a.out、Mach-O等。NASM使用…

复习HTML(进阶)

前言 上一篇的最后我介绍了在表单中&#xff0c;上传文件需要使用到 method属性 和enctype属性。本篇博客主要是详细的介绍这些知识 <form action"http://localhost:8080/test" method"post" enctype"multipart/form-data"> method属性…

SQL Inject-基于报错的信息获取

常用的用来报错的函数 updatexml() : 函数是MYSQL对XML文档数据进行查询和修改的XPATH函数。 extractvalue(): 函数也是MYSQL对XML文档数据进行查询的XPATH函数。 floor(): MYSQL中用来取整的函数。 思路&#xff1a; 在MySQL中使用一些指定的函数来制造报错&am…

YOLOv8改进 - 注意力篇 - 引入SEAttention注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了SEAttention注意力在YOLOv8中的使用。包含SEAttention原理分析&#xff0c;SEAttention的代码、SEAttention的使用方法、以及添加以后的yaml文件及运行记录。 二、SEAttention原理分析 SEAttention官方论文地址&#xff1…

深度学习——线性神经网络(一、线性回归)

目录 一、线性回归1.1 线性回归的基本元素1.1.1 术语介绍1.1.2 线性模型1.1.3 损失函数1.1.4 解析解1.1.5 随机梯度下降1.1.6 模型预测 1.2 正态分布与平方损失 因为线性神经网络篇幅比较长&#xff0c;就拆成几篇博客分开发布。目录序号保持连贯性。 一、线性回归 回归&#x…

基于单片机智能百叶窗卷帘门自动门系统

** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

二叉树深度学习——将二叉搜索树转化为排序的双向链表

1.题目解析 题目来源&#xff1a;LCR 155.将二叉搜索树转化为排序的双向链表 测试用例 2.算法原理 首先题目要求原地进行修改并且要求左指针代表前驱指针&#xff0c;右指针代表后继指针&#xff0c;所以思路就是 1.使用前序遍历创建两个指针cur、prev代表当前节点与前一个节点…

STM32三种启动模式:【详细讲解】

STM32在上电后&#xff0c;从那里启动是由BOOT0和BOOT1引脚的电平决定的&#xff0c;如下表&#xff1a; BOOT模式选引脚启动模式BOOT0BOOT1X0主Flash启动01系统存储器启动11内置SRAM启动 BOOT 引脚的值在重置后 SYSCLK 的第四个上升沿时被锁定。在重置后,由用户决定是如何设…

硬件开发笔记(三十):TPS54331电源设计(三):设计好的原理图转设计PCB布板,12V输入电路布局设计

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142694484 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

挖矿病毒记录 WinRing0x64.sys

之前下载过福晰pdf编辑器&#xff0c;使用正常。 某天发现机器启动后&#xff0c;过个几分钟(具体为5min)会自动运行几个 cmd 脚本(一闪而过)&#xff0c;但是打开任务管理器没有发现异常程序&#xff08;后面发现病毒程序伪装成System系统程序&#xff0c;见下图&#xff09;…

Ascend C算子加速:优化与创新

Ascend C算子加速&#xff1a;优化与创新 随着大模型的迅速发展和人工智能计算需求的剧增&#xff0c;优化硬件性能变得尤为重要。针对这一需求&#xff0c;昇腾推出了Ascend Operator Library&#xff08;AOL&#xff09;算子加速库&#xff0c;专注于为开发者提供高效的算子…

C++-vector模拟实现

###vector底层相当于是数组&#xff0c;查看源码可以发现&#xff0c;这个类的私有成员变量是三个迭代器&#xff1b;在实现时迭代器就可以当作是vector里面的元素的指针类型&#xff1b; ###vector是一个类模板&#xff0c;实现时也应当按照这样的写法用一个模板去实现&#…

某项目实战代码(一)

1.下载安装并配置环境变量openssl&#xff0c;可自行在网上寻找。 2.在项目中导入opensll中的“包含(include)”和“库(lib)” 3.选择debug x86平台&#xff0c;不然会报错。 4.运行结果如下。可自行比对 md5 value: 33b3bc8e05b4fcc16bd531dd9adac166 5.代码如下 #define…

基于STM32的智能家居灯光控制系统设计

引言 本项目将使用STM32微控制器实现一个智能家居灯光控制系统&#xff0c;能够通过按键、遥控器或无线模块远程控制家庭照明。该项目展示了如何结合STM32的外设功能&#xff0c;实现对灯光的智能化控制&#xff0c;提升家居生活的便利性和节能效果。 环境准备 1. 硬件设备 …

unix中的exec族函数介绍

一、前言 本文将介绍unix中exec族函数&#xff0c;包括其作用以及使用方法。当一个进程调用fork函数创建一个新进程后&#xff0c;新进程可以直接执行原本正文段的其他内容&#xff0c;但更多时候&#xff0c;我们在一个进程中调用fork创建新的进程后&#xff0c;希望新进程能…

在pycharm中设置后直接运行js代码

环境&#xff1a; pycharm专业版2020.3.2 已经安装nodejs和npm&#xff0c;并已经加入环境变量。 nodejs的安装参考在pycharm中运行js文件以及附加node.js下载步骤_python_脚本之家 下面开始在pycharm中设置&#xff0c;让其可以直接运行js代码&#xff0c;即需要安装一个叫…

C# 字符与字符串

本课要点&#xff1a; 1、字符类Char的使用 2、字符串类String的使用 3、可变字符串****StringBuilder 4、常见错误 一 何时用到字符与字符串 问题&#xff1a; 输出C#**课考试最高分&#xff1a;**98.5 输出最高分学生姓名&#xff1a;张三 输出最高分学生性别&#x…

六.应用层

目录 ​编辑 4.11 DHCP 6.1应用层的概述 6.2网络应用模型 CS P2P 6.3DNS 域名 www是什么&#xff0c;http是什么&#xff0c;到底什么区别&#xff1f; DNS出现及演化 DNS概括 DNS域名解析过程 6.4FTP FTP客户/服务器 FTP工作原理 FTP传输模式 6.5电子邮件 电…