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

news2024/11/28 3:42:08

行为型软件设计模式

概述

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

  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();
    }

    // 返回迭代器对象
    @Override
    public 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;
    }

    // 判断是否还有下一个元素
    @Override
    public boolean hasNext() {
        return index < aggregate.getSize();
    }

    // 返回当前元素并移动到下一个位置
    @Override
    public 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.coloradmin.cn/o/719944.html

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

相关文章

【网络安全带你练爬虫-100练】第4练:添加异常处理代码

目录 一、异常处理代码&#xff1a; 二、执行结果&#xff1a; 三、完整代码&#xff1a; &#xff08;当代码越来越长的时候&#xff0c;异常处理代码有时候能起到很好的作用&#xff09; 一、异常处理代码&#xff1a; &#xff08;1&#xff09;try-except搭配&#xff…

Stable Difussion 解决绘图图片灰暗模糊,让图像色彩更丰富

在使用Stable Difussion进行AI绘画的时候&#xff0c;使用VAE能够产生许多有趣的效果。其滤镜功能可根据需要调整图像的色彩饱和度&#xff0c;使图像产生不同的视觉效果。 如下图所示&#xff1a; 但是如果不使用VAE那你的图像可能就会变得灰暗。 文章目录 VAE用途VAE的使…

cspm是什么?对比pmp怎么样?

一、国标项目管理&#xff08;项目管理专业人员能力评级&#xff09;证书是什么&#xff1f; 证书样式 《项目管理专业人员能力评价要求》&#xff08;GB/T 41831-2022&#xff09;是2022年10月12日开始实施的一项中国国家标准&#xff0c;归口于全国项目管理标准化技术委员会。…

【问题】TypeError: Cannot read properties of undefined (reading ‘getStackAddendum‘)

问题描述 项目运行中&#xff0c;控制台提示类型错误&#xff0c;无法读取未定义的属性getStackAddendum TypeError: Cannot read properties of undefined (reading getStackAddendum) 原因分析&#xff1a; 在上述截图的错误日志中&#xff0c;有执行validateChildKeys和va…

初识C++:从零开始掌握神秘之门的钥匙

&#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ 目录 一、什么是C&#xff1f; 二、 C的发展史 三、C的重要性 3.1 语言的使用广泛度 3.2 在工作领域 3.2.1. 操作系…

Java压缩图片以及获取缩略图

Java压缩图片以及获取缩略图 前言使用到的类ToolkitMediaTrackerImageBufferedImageImageWriterImageIOImageWriteParamGraphics2D 工具类ImageUtil测试测试代码测试结果 遇到的问题 前言 这个应该就没啥多说的了&#xff0c;接触过图片操作的基本都知道上述功能为常用功能。 …

Java-数据结构(一)-java1中有哪些数据结构呢?

这里写目录标题 前言一、为什么需要数据结构&#xff1f;1、低效的操作2、占用过多的内存空间3、困难的数据操作 二、枚举&#xff08;Enumeration&#xff09;1、定义2、关键字3、适用场景 三、 位集合&#xff08;BitSet&#xff09;1、定义2、方法3、适用场景 四、向量&…

Ping命令讲解

ping是什么&#xff1f; ping (Packet Internet Groper)&#xff0c;因特网包探索器&#xff0c;用于测试网络连接量的程序。Ping发送一个ICMP&#xff1b;回声请求消息给目的地并报告是否收到所希望的ICMP echo &#xff08;ICMP回声应答&#xff09;。它是用来检查网络是否通…

Java链式编程

一、链式编程 1.1.释义 链式编程&#xff0c;也叫级联式编程&#xff0c;调用对象的函数时返回一个this对象指向对象本身&#xff0c;达到链式效果&#xff0c;可以级联调用。 1.2.特点 可以通过一个方法调用多个方法&#xff0c;将多个方法调用链接起来&#xff0c;形成一…

3D数字化展馆三维设计的特点及优势

随着互联网技术的迭代&#xff0c;web3D技术和虚拟现实技术逐渐发展成熟&#xff0c;我们发现“三维数字展馆”这个词汇已经慢慢进入我们的视野。 三维数字展馆是属于存在于线上WEB端的虚拟三维数字展馆&#xff0c;利用3D建模技术打造一个充满科技感且可无限延伸的空间&#x…

【Linux】基础开发工具——vim篇

目录 一、vim的基本概念1.1 正常/普通/命令模式1.2 插入模式1.3 底行模式 二、vim的基本操作2.1 进入vim2.2 模式切换2.3 退出vim 三、命令模式命令集3.1 移动光标3.2 复制/粘贴3.3 撤销3.4 剪切/删除3.5 更改 四、底行模式命令集4.1 多文本操作4.2 保存/退出4.3 命令执行4.4 调…

第六步:NVIC中断优先级分组

CM4内核支持256个中断&#xff0c;其中包含了16个内核中断和240个外部中断&#xff0c;并且具有256级的可编程中断设置。 STM32F4并没有使用CM4内核的全部东西&#xff0c;而是只用了它的一部分。 STM32F40xx/STM32F41xx总共有92个中断。 STM32F42xx/STM32F43xx则总共有96个中断…

ModaHub魔搭社区:UCloud优刻得镜像市场上线Milvus向量数据库镜像

近日&#xff0c;为了更好地满足客户在AI业务场景下的需要&#xff0c;UCloud优刻得镜像市场上线支持了Milvus向量数据库镜像。 随着时代发展&#xff0c;文档资料、图片、语音、视频影像等非结构化数据开始海量涌现。为了能够更好地使用这些数据&#xff0c;可以使用embedding…

Jmeter参数传递——将上一个接口的返回结果做为变量传入下一个接口参数中

我们以CSDN文章发布为例&#xff1a; CSDN博客 - 专业IT技术发表平台CSDN博客为中国软件开发者、IT从业人员、IT初学者打造交流的专业IT技术发表平台,全心致力于帮助开发者通过互联网分享知识,让更多开发者从中受益,一同和IT开发者用代码改变未来.https://blog.csdn.net/ 注&…

Spark学习(一)---Spark简介和运行环境

文章目录 1.Spark介绍1.1 Spark核心模块1.2 使用Spark写一个WordCount1.2 Spark运行环境1.2.1 Local模式1.2.2 Standalone 模式1.2.3 高可用模式(HA)模式1.2.4 Yarn模式 1.Spark介绍 Hadoop中的MapReduce框架在设计之初并不是为了满足循环迭代式数据流处理&#xff0c;因此在多…

DMDSC共享存储集群启动、关闭及介绍

DMDSC介绍 DM 共享存储数据库集群&#xff08;DMDSC&#xff09;。DM共享存储数据库集群&#xff0c;允许多个数据库实例同时访问、操作同一数据库&#xff0c;具有高可用、高性能、负载均衡等特性。DMDSC 支持故障自动切换和故障自动重加入&#xff0c;某一个数据库实例故障后…

FastDFS【FastDFS环境搭建_Linux、FastDFS指令、复习】(二)-全面详解(学习总结---从入门到深化)

目录 FastDFS环境搭建_Linux FastDFS指令 复习&#xff1a; FastDFS环境搭建_Linux 下载安装gcc 安装方式为yum安装&#xff08;需网络&#xff09;&#xff1a; yum install gcc-c perl-devel pcre-devel openssl-devel zlib-devel wget 下载安装FastDFS wget https:/…

leetcode42. 接雨水(单调栈-java)

接雨水 leetcode42. 接雨水题目描述单调栈解题代码演示 单调栈专题 leetcode42. 接雨水 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/trapping-rain-water 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图…

一章让你明白什么是权限

目录 &#x1f30f;什么是Linux 权限&#xff1f; &#x1f30f;文件&#xff1a; &#x1f30f;目录&#xff1a; &#x1f30f;查看文件的权限 &#x1f30f;权限针对的三类用户&#xff1a; &#x1f30f;ls -l 命令显示的意义 &#x1f30f;修改文件的属性和权限 …

uni-app获取系统信息(手机牌子、手机型号、屏幕宽度、屏幕高度)

uni.getSystemInfo({success(res) {console.log(res.brand) //手机牌子console.log(res.model) //手机型号console.log(res.screenWidth) //屏幕宽度console.log(res.screenHeight) //屏幕高度}) .exec()}}); 如下 官网链接&#xff1a;系统信息的概念 | uni-app官网