首页 > 其他分享 >设计模式-迭代子模式

设计模式-迭代子模式

时间:2024-07-03 12:28:09浏览次数:19  
标签:return 迭代 对象 collection 集合 设计模式 public 子模式

一、迭代子模式的核心思想

迭代子模式又称 Cursor 模式,是对象的行为模式。迭代子模式可以顺序地访问聚集中的对象而不必显露聚集的内部表象。

迭代子模式的作用是访问一个聚集,因此它需要包含两类对象。

  • 聚集对象:聚集对象中提供了一系列的数据集合,它还需要提供访问该集合中元素的方法以供迭代器对象使用,如下图所示的 Collection是聚集对象的接口,MyCollection是具体的实现类。
  • 迭代器对象:它提供了迭代聚集对象的功能,根据需要可以包括前移、后移、首、尾的名种方法,如下图所示的Iterator 就是一个迭代器接口,MyIterator 是一个具体的实现。
    在这里插入图片描述
    下面来看具体的实现。

(1) 集合接口 Collection.java 中首先需要定义一个取得迭代器对象的接口,并提供取得集合中某元素的方法 get(),以及取得集合大小的方法 size()。其源代码如下程序所示。

package behavior.iterator;

/**
* @author Minggg
* 集合接口
*/
public interface Collection {

	// 取得迭代子
	public Iterator iterator();

	// 取得集合元素
	public Object get(int i);

	// 取得集合大小
	public int size();

}

(2) 集合类 MyCollection.java提供了一个存放集合数据的数组,该数组可以是任意的集合类。这里我们使用了一个表示 26个英文字母的字符串数组作为演示。同时,该类需要实现其接口提供的3个函数。在创建迭代对象时,需要将当前对象this 作为参数传递给迭代器对象,以便迭代对象能够控制当前对象。其源代码如下程序所示。

package behavior.iterator;

/**
* @author Minggg
* 集合接口
*/
public class MyCollection implements Collection {

	public String[] str= { "A","B","C","D","E", "F","G", "H","I","J","K", "L","M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};

	@Override
	public Iterator iterator() {
		return new MyIterator(this);
	}
	public Object get(int i) {
		return str[i];
	}
	public int size(){
		return str.length;
	}

}

(3) 迭代子接口Iterator.java可以根据自身的需要提供各种迭代函数,例如下例中我们就提供了4种移动光标的函数,以及判断位置的函数。其源代码如下程序所示。

package behavior.iterator;

/**
* @author Minggg
* 迭代子接口
*/
public interface Iterator {

	// 前移
	public Object previous();
	public boolean hasPrevious();
	// 后移
	public Object next();
	public boolean hasNext();
	// 第一个
	public Object first();
	public boolean isFirst();
	// 最后一个
	public Object last();
	public boolean isLast();

}

(4) 迭代子 MyIterator.iava拥有一个对Collection对象的引用,并在具体的实现中通过该对象的引用进行集合数据的查询。其源代码如下程序所示。

package behavior.iterator;

public class MyIterator implements Iterator {

	private Collection collection;//集合对多
	private int pos = -1;//默认位置
	
	publie MyIterator(Collection collection) {
		this.collection = collection;
	}
	
	// 第一个
	public Object first(){
		pos = 0;
		return collection.get(pos);
	}
	
	// 是否第一个
	public boolean isFirst() {
		if (pos == 0){
			return true;
		} else {
			return false;
		}
	}
	
	// 最后一个
	public Object last() {
		pos = collection.size()-1;
		return collection.get(pos);
	}
	
	// 是否最后一个
	public boolean isLast() {
		if(pos == collection.size()-1){
			return true;
		} else {
			return false;
		}
	}
	
	// 后移
	public Object next(){
		if (pos < collection.size()-1){
			pos ++;
		}
		return collection.get(pos);
	}
	
	// 后移
	public boolean hasNext(){
		if (pos < collection.size() - 1) {
			return true;
		} else {
			return false;
		}
	}
	
	// 前移
	public Object previous() {
		if(pos > 0) {
			pos --;
		}
		return collection.get(pos);
	}
	
	// 前移
	public boolean hasPrevious() {
		if(pos > 0){
			return true;
		} else {
			return false;
		}
	}
}

我们可以使用以上的集合类和迭代子编写调用代码。首先创建一个MyCollection集合对象collection,并根据该对象取得迭代子it,这样,就可以使用it来迭代査询 collection中的数据了。其源代码如下程序所示。

package behavior.iterator;

public class Test {

	public static void main(String[] args) {
		Collection collection = new MyCollection();
		Iterator it = colleetion.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}

}

运行该程序就会迭代输出集合中的各个字母:

A
B
...
Y
Z

二、何时使用迭代子模式

由此可见,迭代子的作用就是用来方便地查询一个集合中的数据。凡是有聚集数据存在的地方,都可以使用迭代子模式来进行数据迭代。

使用迭代子模式有以下优点

  • 迭代子模式简化了聚集的界面。
  • 因为每一个聚集对象可以有多个迭代子对象,每个迭代子状态是独立的。
  • 由于遍历算法被封装在迭代子角色里面,因此迭代的算法可以独立于聚集对象。

但是,迭代子模式给客户端一个聚集被顺序化的感觉,而且它给出的聚集元素没有类型特征。

三、Java中的应用–Java集合类选代子Iterator和Enumeration

迭代子应用在存在大量集合对象的场景下。在Java API中,为我们提供了功能强大的集合类体系,如下图所示。
在这里插入图片描述
这么多纷繁复杂的类!其中常用类有 Vector、Hashtable、LinkedList、ArrayList 等。从这么多相似的名字中,似乎很难区分它们。理解它们的关键是从最顶层的接口看起,共有两个顶层的接口类。

  • 集合类 Collection:代表多个对象的集合,根据其子接口,又可以分为三大类。
    • Queue:队列类,先进先出的队列。
    • List:列表类,其中的元素是有序的,且允许元素重复。
    • Set:集合类,其中的元素是有序或无序的,且不允许元素重复。
  • 映射类 Map:存储多个键值对。

其中的 List、Set、Map 都有一系列的实现类。

所有的这些集合类,都可以转化为最顶层的Iterator 和 Enumeration对象,它们就是其他所有集合类的迭代子。这两个接口是特殊的数据操作接口,Iterator用于进行数据迭代,称做迭代器;Enumeration用于进行数据枚举,称做枚举。

1.枚举(Enumeration)接口
枚举(Enumeration)接口是从以前版本遗留下来的。Enumeration接口定义了可以对一个对象的类集中的元素进行枚举(一次获得一个)的方法。这个接口尽管没有被据弃,但已经被Iterator所替代。Enumeration对新程序来说是过时的,然而它仍被几种从以前版本遗留下来的类(例如Vector、Hashtable 和 Properties)所定义的方法使用,被几种其他的 API类及被目前广泛使用的应用程序所使用。

Enumeration指定下面的两个方法:

  • boolean hasMoreElements();
  • Obiect nextElement();

执行后,当仍有更多的元素可提取时,hasMoreElement()方法一定返回true。所有元素都被枚举了,则返回 false。nextElement()方法将枚举中的下一个对象作为一个类属性 Object的引用而返回也就是每次调用 nextElement()方法获得枚举中的下一个对象,调用例程必须将那个对象置为包含在枚举内的对象类型。

对于 Enumeration 可以以 Vector 为例。Vector 里有很多对象,如果你要查看其中的所有对象,一个办法是用 Vector 的 get(int index)方法,不过这样效率比较低,另外一个方法是用 Vector 的 elements(方法返回一个 Enumeration 对象,用 Enumeration 的 hasMoreElements()方法向下移动并判断当前位置是否有对象,有则用nextElement()方法返回这个对象。

例如,打印vector v中的所有对象:

Enumeration e = v.elements();
while(e.hasMoreElements()) {
	System.out.println(e.nextElement());
}

2.迭代器(Iterator)接口

另外还有个Iterator 接口,与Enumeration差不多,不过名称比较短,通常推荐用Iterator 对Collection集合进行迭代。迭代器代替了JavaCollections Framework中的 Enumeration。Collection 接口中定义了 iterator()方法,用于返回在此 collection 的元素上进行迭代的迭代器。

迭代器提供了如下3个方法供Collection类的实例使用:

boolean hasNext(); // 如果仍有元素可以迭代,则返回 true
E next(); // 返回选代的下一个元素
void remove(); // 从选代器指向的collection中移除迭代器返回的最后一个元素

例如,要输出Vector对象vect的迭代器,可以这样写:

Iterator it = vect.iterator(); // 得到迭代器对象
while (it.hasNext()) { //迭代循环
	Object obj = it.next(); // 取得对象
}

标签:return,迭代,对象,collection,集合,设计模式,public,子模式
From: https://blog.csdn.net/qq_35885952/article/details/140147027

相关文章

  • 设计模式-观察者模式
    一、观察者模式的核心思想观察者(Observer)模式又名发布一订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,让多个观察者对象同时关注同一个对象,当该对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。如下图所示,观......
  • 设计模式-策略模式
    一、策略模式的核心思想策略模式定义了一系列的算法,并将每一个算法封装起来,使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。策略模式将一系列的算法包装为一个接口抽象类的子类,并由调用者决定调用某一个子类。其中定义了3种角色。策略接口类ICacu......
  • 迭代器协议、可迭代对象(迭代器)、三元表达式、生成器
    今天说的这老几位可是老牛逼了,认真看,咱们挨个介绍哈。1、迭代器协议(1)有一个next()方法(2)只能往后走不能往前退2、可迭代对象可迭代对象又叫做迭代器,什么是可迭代对象呢?很简单,满足迭代器协议的对象就是可迭代对象。说白了,就是满足前面那两条:有一个next()方法,只能往后走不能往......
  • 设计模式
    设计模式六种设计原则单一职责原则组件或模块在封装过程中要保证功能的完善,尽量不要侵入其他的组件,使得组件间关联关系松散里氏替换原则多用组合,少用继承。继承的使用场景是两个类存在isa的关系,单纯的为了复用某个逻辑片段,应该避免使用继承,继承使两个类建立了强关联,且java......
  • 设计模式1-单例模式
    #单例模式    构造函数私有化。        私有化是为了阻止外部代码直接通过new关键字来实例化对象,从而确保单例唯一性,防止有子类继承破坏单例模式的唯一性    改单列对象必须由单例类自己创建    内部提供一个方法给外界调用对象.#饿汉普通实现p......
  • 设计模式的六大原则
    1、依赖倒置原则///<summary>///高层模块不应该依赖底层模块///二者都应该依赖其抽象///</summary>publicclassStudent{publicintAge{get;set;}publicstringName{get;set;}publicdoubleScores{get;set;}publicvoidGetAge()......
  • 设计模式——开闭、单一职责及里氏替换原则
    设计原则是指导软件设计和开发的一系列原则,它们帮助开发者创建出易于维护、扩展和理解的代码。以下是你提到的几个关键设计原则的简要说明:开闭原则(Open/ClosedPrinciple,OCP):开闭原则由BertrandMeyer提出,强调软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味......
  • JavaScript 编程语言【 数据类型】过滤|排序|映射|迭代
    文章目录将border-left-width转换成borderLeftWidth过滤范围原位(inplace)过滤范围降序排列复制和排序数组创建一个可扩展的calculator映射到names映射到对象按年龄对用户排序随机排列数组获取平均年龄数组去重从数组创建键(值)对象Iterableobject(可迭代对象)Symbol.......
  • 【超简单-Java设计模式2】简单工厂模式
    简单工厂设计模式:概念、Java实现与应用剖析简单工厂模式,作为设计模式中最直观、易懂的一种,被广泛应用于软件开发中,尤其在需要创建一系列相关或相互依赖对象的场景下。本文将深入探讨简单工厂模式的概念,通过Java代码示例展示其实现,并分析其在实际开发中的使用场景与优缺点。......
  • Java 说一下你熟悉的设计模式?
    在Java开发中,设计模式是常用的解决方案,用于解决软件设计中的常见问题。以下是一些常用的设计模式:创建型模式(CreationalPatterns)单例模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。示例:publicclassSingleton{privatestaticSingletoni......