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

命令模式

是什么

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

实例

在这里插入图片描述

在这里插入图片描述

请求封装成为对象

//用来声明执行操作的接口  
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. 优缺点

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网智能项目全面解析

目录 引言 一、物联网概述 1.1 什么是物联网 1.2 物联网的历史与发展 二、物联网智能项目分类 三、关键组件与技术 3.1 传感器和执行器 3.2 连接技术 3.3 数据处理与分析 3.4 用户界面 四、物联网智能项目案例分析 4.1 智能家居 4.2 智慧城市 4.3 工业物联网 4.4…

react-问卷星项目(3)

项目实战 React Hooks 缓存&#xff0c;性能优化&#xff0c;提升时间效率&#xff0c;但是不要为了技术而优化&#xff0c;应该是为了业务而进行优化 内置Hooks保证基础功能&#xff0c;灵活配合实现业务功能&#xff0c;抽离公共部分&#xff0c;自定义Hooks或者第三方&am…

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

目录 120.创建 init C 容器后&#xff0c;其状态不正常&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-113 属于【Kubernetes】的生产…

Swagger配置且添加小锁(asp.net)(笔记)

此博客是基于 asp.net core web api(.net core3.1)框架进行操作的。 一、安装Swagger包 在 NuGet程序包管理中安装下面的两个包&#xff1a; swagger包&#xff1a;Swashbuckle.AspNetCore swagger包过滤器&#xff1a;Swashbuckle.AspNetCore.Filters 二、swagger注册 在…

开源 AI 智能名片 O2O 商城小程序与抖音:品牌传播的新机遇与挑战

摘要&#xff1a;本文探讨了开源 AI 智能名片 O2O 商城小程序在品牌传播中的作用&#xff0c;以及与抖音平台相结合所带来的机遇与挑战。分析了抖音如何利用算法适配品牌调性为门店找到目标消费者&#xff0c;放大品牌势能&#xff0c;同时阐述了新品牌在抖音上进行品牌传播的优…

C++平台跳跃游戏

目录 开头程序Game.cpp源文件Player.h头文件Player.cpp源文件 程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 Game.cpp源文件 #include <iostream> #include "Player.h" using namespace std; void printma…

[数据集][目标检测]电力场景防震锤缺陷检测数据集VOC+YOLO格式705张1类别

重要说明&#xff1a;防震锤缺陷图片太难找&#xff0c;数据集里面存在大量单一场景图片&#xff0c;请仔细查看图片预览谨慎下载&#xff0c;此外数据集均为小目标检测&#xff0c;如果训练map偏低属于正常现象 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径…

19.第二阶段x86游戏实战2-寻找寻路call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

C++容器之list基本使用

目录 前言 一、list的介绍&#xff1f; 二、使用 1.list的构造 2.list iterator的使用 3.list capacity &#x1f947; empty &#x1f947;size 4.list element access &#x1f947; front &#x1f947; back 5.list modifiers &#x1f947; push_front &#x1f947; po…

VMware ESXi 8.0U3b macOS Unlocker OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布

VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布 VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版&#xff0c;Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco …

Xshell7下载及服务器连接

一、Xshell-7.0.0164p、Xftp 7下载 1.1、文件下载 通过网盘分享的文件&#xff1a;xshell 链接: https://pan.baidu.com/s/1qc0CPv4Hkl19hI9tyvYZkQ 提取码: 5snq –来自百度网盘超级会员v2的分享 1.2、ip连接 下shell和xftp操作一样&#xff1a;找到文件—》新建—》名称随…

HTML增加文本复制模块(使用户快速复制内容到剪贴板)

增加复制模块主要是为了方便用户快速复制内容到剪贴板&#xff0c;通常在需要提供文本信息可以便捷复制的网页设计或应用程序中常见。以下是为文本内容添加复制按钮的一个简单实现步骤&#xff1a; HTML结构&#xff1a; 在文本旁边添加一个复制按钮&#xff0c;例如 <butto…

【C++】set容器和map容器的基本使用

一、序列式容器和关联式容器 1、STL中的部分容器如&#xff1a;string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间一般没有紧密的关联关系&#xff0c;…

第L2周:机器学习|线性回归模型 LinearRegression:2. 多元线性回归模型

本文为365天深度学习训练营 中的学习记录博客原作者&#xff1a;K同学啊 任务&#xff1a; ●1. 学习本文的多元线形回归模型。 ●2. 参考文本预测花瓣宽度的方法&#xff0c;选用其他三个变量来预测花瓣长度。 一、多元线性回归 简单线性回归&#xff1a;影响 Y 的因素唯一&…

1、Spring Boot 3.x 集成 Eureka Server/Client

一、前言 基于 Spring Boot 3.x 版本开发&#xff0c;因为 Spring Boot 3.x 暂时没有正式发布&#xff0c;所以很少有 Spring Boot 3.x 开发的项目&#xff0c;自己也很想了踩踩坑&#xff0c;看看 Spring Boot 3.x 与 2.x 有什么区别。自己与记录一下在 Spring Boot 3.x 过程…

Linux ssh 免密登录配置

参考资料 ~/.ssh/configについて~/.ssh/configを使ってSSH接続を楽にする.ssh/configファイルでSSH接続を管理する 目录 一. 密钥生成1.1 生成工具1.1.1 OpenSSH1.1.2 Git 1.2 生成命令1.3 注意事项1.4 解决路径中的用户名乱码 二. 将公钥配置到目标服务&#xff0c;免密登录2…

如何在 Windows 10 上恢复未保存/删除的 Word 文档

您是否整夜都在处理重要的 word 文件&#xff0c;但忘记保存它&#xff1f;这篇文章是给你的。在这里&#xff0c;我们将解释如何恢复未保存的 word 文档。除此之外&#xff0c;您还将学习如何恢复已删除的 word 文档。 从专业人士到高中生&#xff0c;每个人都了解丢失重要 W…

从HarmonyOS Next导出手机照片

1&#xff09;打开DevEco Studio开发工具 2&#xff09;插入USB数据线&#xff0c;连接手机 3&#xff09;在DevEco Studio开发工具&#xff0c;通过View -> Tool Windows -> Device File Browser打开管理工具 4&#xff09;选择storage -> cloud -> 100->fi…

JDBC 概述

JDBC 概述 JDBC的基本概念与功能JDBC的工作原理JDBC的组件与类JDBC的类型与特性JDBC的应用场景 JDBC&#xff08;Java Database Connectivity&#xff09;即Java数据库连接&#xff0c;是Java编程语言用于与数据库进行连接和操作的API&#xff08;应用程序编程接口&#xff09;…

Linux:深入理解冯诺依曼结构与操作系统

目录 1. 冯诺依曼体系结构 1.1 结构分析 1.2 存储结构分布图 2. 操作系统 2.1 概念 2.2 如何管理 2.3 什么是系统调用和库函数 1. 冯诺依曼体系结构 1.1 结构分析 不管是何种计算机&#xff0c;如个人笔记本电脑&#xff0c;服务器&#xff0c;都是遵循冯诺依曼结构。…