软件设计模式与体系结构-设计模式-行为型软件设计模式-迭代器模式

行为型软件设计模式

概述

行为型设计模式是软件设计模式中的一类,用于处理对象之间的交互和通信。这些模式关注的是对象之间的行为和职责分配。以下是几种常见的行为型设计模式:

  1. 观察者模式(Observer Pattern):定义了一种一对多的依赖关系,当一个对象的状态发生变化时,其依赖对象将自动收到通知并进行相应的更新。

  2. 策略模式(Strategy Pattern):定义了一系列算法,并将其封装在可互换的策略对象中,使得算法的选择可以独立于使用它们的客户端。

  3. 迭代器模式(Iterator Pattern):提供一种顺序访问聚合对象中各个元素的方法,而无需暴露聚合对象的内部表示。

  4. 命令模式(Command Pattern):将请求封装成对象,使得可以将不同的请求、队列或者日志来参数化其他对象,并且能够支持撤销操作。

  5. 状态模式(State Pattern):允许对象在内部状态改变时改变它的行为,看起来就像是改变了它的类。

  6. 责任链模式(Chain of Responsibility Pattern):将请求的发送者和接收者解耦,使得多个对象都有机会处理请求,将这些对象连接成一条链,并沿着这条链传递请求,直到有对象处理它。

  7. 模板方法模式(Template Method Pattern):定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。

  8. 访问者模式(Visitor Pattern):定义了对某个对象结构中各元素的操作,可以在不改变元素类的前提下定义新的操作。

这些行为型设计模式提供了一些通用的解决方案,可以帮助开发人员更好地组织和管理对象之间的交互,使得系统更加灵活、可扩展和易于维护。不同的模式适用于不同的场景,开发人员可以根据具体需求选择合适的设计模式来解决问题。

动机

行为型软件设计模式关心算法和对象之间的责任分配,不仅是描述对象或类模式,更加侧重描述它们之间的通信模式

内容

迭代器模式抽象了访问和遍历一个集合中的对象的方式
访问者模式封装了分布于多个类之间的行为
中介者模式通过在对象间引入一个中介对象,避免对象间的显式引用
策略模式将算法封装在对象中,这样可以方便指定或改变一个对象使用的算法
状态模式封装了兑现过的状态,使得当对象的状态发生变化时,该对象可以改变自身的行为

一、迭代器模式

概念

怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,还能够提供多种不同的遍历方式

迭代器模式的关键思想是
将对列表的访问和遍历从列表对象中分离出来,放入一个独立的迭代对象中

代码

迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供一种顺序访问聚合对象中各个元素的方法,而无需暴露聚合对象的内部表示。迭代器模式将遍历聚合对象的责任分离出来,使得聚合对象和迭代器对象可以独立地变化。

下面是一个简单的迭代器模式的代码示例,以便更好地理解:

// 定义迭代器接口
public interface Iterator {boolean hasNext();Object next();
}// 定义具体的聚合对象
public class ConcreteAggregate implements Iterable {private List<Object> elements = new ArrayList<>();public void addElement(Object element) {elements.add(element);}public Object getElement(int index) {return elements.get(index);}public int getSize() {return elements.size();}// 返回迭代器对象@Overridepublic Iterator iterator() {return new ConcreteIterator(this);}
}// 定义具体的迭代器对象
public class ConcreteIterator implements Iterator {private ConcreteAggregate aggregate;private int index;public ConcreteIterator(ConcreteAggregate aggregate) {this.aggregate = aggregate;this.index = 0;}// 判断是否还有下一个元素@Overridepublic boolean hasNext() {return index < aggregate.getSize();}// 返回当前元素并移动到下一个位置@Overridepublic Object next() {if (hasNext()) {return aggregate.getElement(index++);}return null;}
}// 客户端代码
public class Client {public static void main(String[] args) {ConcreteAggregate aggregate = new ConcreteAggregate();aggregate.addElement("Element 1");aggregate.addElement("Element 2");aggregate.addElement("Element 3");Iterator iterator = aggregate.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

在上述示例中,迭代器模式包括以下几个关键组件:

  • 迭代器接口(Iterator):定义了迭代器的通用操作,例如hasNext()方法用于判断是否还有下一个元素,next()方法用于返回当前元素并移动到下一个位置。

  • 具体聚合对象(ConcreteAggregate):具体的聚合对象实现了Iterable接口,并在iterator()方法中返回了具体的迭代器对象。

  • 具体迭代器对象(ConcreteIterator):具体的迭代器对象实现了迭代器接口,并通过聚合对象来遍历聚合对象中的元素。

在客户端代码中,我们首先创建一个具体聚合对象(ConcreteAggregate),并添加一些元素。然后通过调用iterator()方法获取具体的迭代器对象(ConcreteIterator),使用迭代器对象遍历聚合对象中的元素并打印出来。

迭代器模式的优点包括:

  • 分离了聚合对象和遍历逻辑,使得

聚合对象的结构和遍历算法可以独立变化。

  • 简化了聚合对象的接口,客户端无需关心聚合对象的内部结构,只需要通过迭代器进行遍历操作。
  • 支持多种遍历方式,可以定义不同类型的迭代器来满足不同的遍历需求。

总之,迭代器模式通过将遍历操作从聚合对象中分离出来,提供了一种统一的访问元素的方式,并且使得聚合对象和迭代器对象可以独立地变化。这样可以简化代码结构,提高代码的可读性和可维护性。

类图

在这里插入图片描述

实例一:

在这里插入图片描述
在这里插入图片描述
迭代器里的四个方法(一般)
1.boolean hasNext()
2.next()
3.remove()
4.getNumOfItems()

实例二:

在这里插入图片描述
在这里插入图片描述

优缺点

优点:

  1. 迭代器模式支持以不同的方式遍历同一个聚合,复杂的聚合可用多种方式进行遍历。
  2. 满足“开闭原则”的要求
  3. 迭代器简化了聚合的接口。有了迭代器的遍历接口,聚合本身就不需要类似的遍历接口了,这样就简化了聚合的接口

缺点:

  1. 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类
  2. 类的个数成对增加,这在一定程度上增加了系统的复杂性。

模式适用环境

在以下情况下可以使用迭代器模式:

  1. 访问一个聚合对象的内容而无须暴露它的内部表示。
  2. 需要为聚合对象提供多种遍历方式。
  3. 为遍历不同的聚合结构提供一个统一的接口。

课程作业

在这里插入图片描述
在例4.4中增加一个迭代器,按照斜对角线迭代遍历矩阵。请画出类图

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【CEEMDAN-VMD-GRU】完备集合经验模态分解-变分模态分解-门控循环单元预测研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【随手记】使用Flask做代理为虚拟机提供pip源

最近在重做虚拟机环境&#xff0c;虚拟机不可连外网&#xff0c;最初python包都是通过离线whl进行安装。但是离线文件已经找不到了&#xff0c;不想重新去一个个下载&#xff0c;而且本地环境跟虚拟机环境也不一致&#xff0c;pip download可能会遇到版本问题&#xff0c;遂考虑…

【对象存储】那些事

最近在某个项目中使用了对象存储。以前看过一个新闻&#xff1a;某公司的对象存储被盗刷&#xff0c;一夜之间账户欠费几十万&#xff01;我们这点小买卖可经不起这么折腾&#xff01;所以下功夫研究了下&#xff0c;防患于未然。 说到防盗刷&#xff0c;我们还得了解对象存储是…

前端实战——尚品汇(网页开发)

/* 基础设置 */ .container {width: 1190px;margin: 0 auto; } /* #region顶部导航条start */ .topbar {height: 30px;background-color: #ececec; } .welcome {height: 30px;line-height: 30px;font-size: 0;color: #666; } .welcome span,.welcome a {font-size: 12px; } .we…

(五)python实战——使用sqlalchemy完成Sqlite3数据库表的增、删、查、改操作案例

前言 本节内容我们使用sqlalchemy框架完成Sqlite3数据库表的增删查改等常规操作&#xff0c;相较于原生Sqlite的数据库操作&#xff0c;sqlalchemy通过ORM映射完成实体对象的映射&#xff0c;通过映射关系完成对象和数据的转换&#xff0c;完成数据的操作。 正文 ①在项目中…

Matlab|改进的粒子群算法优化支持向量机(回归拟合)

作者在前面的文章中介绍了粒子群算法的原理及其2种改进算法&#xff0c;本文将基于这三种优化方法&#xff0c;应用于支持向量机进行预测&#xff0c;并对比改进算法与标准粒子群算法的预测性能&#xff0c;结果显示改进后的方法能够得到更佳的预测效果。 00 文章目录 1 支持…

jupyter中如何管理内核

1、jupyter notebook如何和已有的虚拟环境关联起来&#xff1a; 如果在电脑中某个conda的虚拟环境中已经安装了jupyter&#xff0c;其他虚拟环境想要作为内核在jupyter中使用&#xff0c;分为两个步骤&#xff1a; 第一步&#xff1a;在没有jupyter的环境中下载ipykernel&…

SPI机制

SPI机制是Service Provider Interface&#xff0c;是服务提供发现机制&#xff0c;用来启用框架扩展和替换组件。比如java.sql.Driver接口&#xff0c;其他不同厂商可以针对同一接口做出不同的实现&#xff0c;MySQL和PostgreSQL都有不同的实现提供给用户&#xff0c;而Java的S…

局部均方差滤波(磨皮)

note 锚点灰度值 用 原图像对应点的原灰度值 和 局部均值加权得到 局部均值 由 掩膜 区域计算得到 权重 由 局部方差 与用户输入参数计算确定 code // 局部均方差滤波 /*\brief 局部均方差滤波\param src:原矩阵&#xff0c;单通道\param res:结果矩阵\param size:掩膜矩形…

电动力学复习提纲

电动力学复习提纲 电动力学核心知识点 电磁场能量密度和能流 场和电荷的能量守恒电磁场的能量密度和能流密度 电偶极矩&#xff0c;磁偶极矩和电四极矩 电极化强度矢量与电偶极矩 磁化强度与磁偶极矩 电势的多级展开 磁矢势的多级展开 非相对论体系的电磁能 静电能 小区…

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 在线考试管理系统的设计与实现

一.项目介绍 学生在线考试系统分为三类角色 超管、老师、学生 超级管理员&#xff1a;维护考试管理、提供管理、成绩查询、学生管理以及教师管理 老师&#xff1a;维护考试管理、提供管理、成绩查询以及学生管理 学生&#xff1a;我的试卷…

解决:yarn 无法加载文件 “C:\Users\admin\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本“ 的问题

1、问题描述&#xff1a; 其一、报错的整体代码为&#xff1a; yarn : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本 // 整体的报错代码为 &#xff1a; yarn : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\yar…