Modèle d'itérateur en Java

introduction

Présentation des modèles de conception de [GoF](https://ja.wikipedia.org/wiki/Gang of for _ (Information Engineering)) ["Introduction aux modèles de conception appris dans le langage Java augmenté et révisé"]( https://www.amazon.co.jp/ Édition augmentée et révisée Introduction aux modèles de conception appris en langage Java-Yuki-Hiroshi / dp / 4797327030 / ref = pd_lpo_sbs_14_t_0? _ Encoding = UTF8 & psc = 1 & refRID = 2ZE4GPYNN55JGDR5QMHP) Je vais résumer sur.

Modèle d'itérateur

Qu'est-ce que Iterator

Iterator est un mot anglais qui signifie «** répéteur » en japonais. Surtout en programmation, cela signifie une abstraction et une généralisation de " pointant les choses **" lors de l'accès aux agrégats en séquence. Je pense qu'il est difficile de saisir l'image à partir de cette seule explication, je vais donc donner un exemple plus concret. Je pense que beaucoup de gens ont écrit des déclarations répétitives qui affichent tous les éléments du tableau ʻarray` comme indiqué ci-dessous.

sample.java


for (int i = 0; i < array.length; i++) {
  System.out.println(array[i]);
}

Ici, la variable ʻi devient un indice du tableau ʻarray, et les éléments du tableau sont accédés en séquence. De cette façon, l'itérateur est "** pointant à plusieurs reprises vers le tout et scanne **".

Personnage

Le modèle Itarator utilise les classes et les interfaces qui apparaissent dans le diagramme de classes ci-dessous. image.png

interface

Aggregate.java


public interface Aggregate {
	public abstract Iterator iterator();
}

Iterator.java


public interface Iterator {
	public abstract boolean hasNext();

	public abstract Object next();
}

Classe d'implémentation

Implémentez l'interface et décrivez le traitement spécifique. Des exemples spécifiques seront décrits plus loin.

Exemple concret

À titre d'exemple concret, l'explication est basée sur "** Liste d'employés qui récapitule les employés " et " Itérateur de liste d'employés **".

Classe d'implémentation

Employee.java


public class Employee {
	private String name;
	private String employeeCode;

	public Employee(String name, String employeeCode) {
		this.name = name;
		this.employeeCode = employeeCode;
	}

	public String getName() {
		return name;
	}

	public String getEmployeeCode() {
		return employeeCode;
	}
}

EmployeeList.java


public class EmployeeList implements Aggregate {
	private Employee[] employees;
	private int last = 0;

	public EmployeeList(int maxsize) {
		this.employees = new Employee[maxsize];
	}

	public Employee getEmployeeAt(int index) {
		return employees[index];
	}

	public void appendEmployee(Employee employee) {
		this.employees[last] = employee;
		last++;
	}

	public int getLength() {
		return last;
	}

	public Iterator iterator() {
		return new EmployeeListIterator(this);
	}
}

EmployeeListIterator.java


public class EmployeeListIterator implements Iterator {
	private EmployeeList employeeList;
	private int index;

	public EmployeeListIterator(EmployeeList employeeList) {
		this.employeeList = employeeList;
		this.index = 0;
	}

	public boolean hasNext() {
		if (index < employeeList.getLength()) {
			return true;
		} else {
			return false;
		}
	}

	public Object next() {
		Employee employee = employeeList.getEmployeeAt(index);
		index++;
		return employee;
	}
}

Classe d'exécution

Main.java


public class Main {
	public static void main(String[] args) {
		EmployeeList employeeList = new EmployeeList(4);
		employeeList.appendEmployee(new Employee("Tarou_Tanaka", "C001"));
		employeeList.appendEmployee(new Employee("Hanako_Yamada", "C002"));
		employeeList.appendEmployee(new Employee("Yuuya_Suzuki", "C003"));
		employeeList.appendEmployee(new Employee("Kanako_Satou", "C004"));
		Iterator it = employeeList.iterator();
		while (it.hasNext()) {
			Employee employee = (Employee) it.next();
			System.out.println(employee.getName() + ":" + employee.getEmployeeCode());
		}
	}
}

Résultat d'exécution

Le résultat de l'exécution de «Main.class» est le suivant. Vous pouvez voir que la sortie est correcte dans l'ordre dans lequel ils ont été ajoutés à ʻemployeeList`.

Résultat d'exécution


Tarou_Tanaka:C001
Hanako_Yamada:C002
Yuuya_Suzuki:C003
Kanako_Satou:C004

mérite

En utilisant Iterator, vous n'avez pas besoin d'être conscient du type d'agrégat (tableau, ArrayList, Vector, etc.) et du type d'implémentation effectué lors du comptage. Ci-dessous, nous définissons ʻEmployeeList.class, qui change l'agrégat d'un tableau en ArrayList. Pour le moment, il n'est pas nécessaire de modifier la classe d'exécution Main.class`, et le résultat de l'exécution est le même que pour un tableau.

EmployeeList.java


import java.util.ArrayList;

public class EmployeeList implements Aggregate {
	private ArrayList<Employee> employees;

	public EmployeeList(int initialsize) {
		this.employees = new ArrayList<>(initialsize);
	}

	public Employee getEmployeeAt(int index) {
		return (Employee) employees.get(index);
	}

	public void appendEmployee(Employee employee) {
		employees.add(employee);
	}

	public int getLength() {
		return employees.size();
	}

	public Iterator iterator() {
		return new EmployeeListIterator(this);
	}
}

Résultat d'exécution


Tarou_Tanaka:C001
Hanako_Yamada:C002
Yuuya_Suzuki:C003
Kanako_Satou:C004

Postscript (31/10/2018)

Il existe différentes manières d'accéder à Iterator autres que d'y accéder séquentiellement depuis l'avant. (Ordre inverse, en sauter un, etc.) Cette fois, nous avons ajouté Iterator pour accéder dans l'ordre inverse avec ArrayList. Seules les classes présentant des différences seront publiées, donc pour les autres classes [Résumé](https://qiita.com/mk777/items/398bd26de44eac4f383b#%E3%81%BE%E3%81%A8%E3%82% Veuillez vous enregistrer 81).

interface

Aggregate.class


public interface Aggregate {
	public abstract Iterator iterator();

	public abstract Iterator reverseIterator();
}

Classe d'implémentation

EmployeeList.class


import java.util.ArrayList;

public class EmployeeList implements Aggregate {
	private ArrayList<Employee> employees;

	public EmployeeList(int initialsize) {
		this.employees = new ArrayList<>(initialsize);
	}

	public Employee getEmployeeAt(int index) {
		return (Employee) employees.get(index);
	}

	public void appendEmployee(Employee employee) {
		employees.add(employee);
	}

	public int getLength() {
		return employees.size();
	}

	public Iterator iterator() {
		return new EmployeeListIterator(this);
	}

	public Iterator reverseIterator() {
		return new EmployeeListReverseIterator(this);
	}
}

EmployeeListReverseIterator.class


public class EmployeeListReverseIterator implements Iterator {
	private EmployeeList employeeList;
	private int index;

	public EmployeeListReverseIterator(EmployeeList employeeList) {
		this.employeeList = employeeList;
		this.index = employeeList.getLength() - 1;
	}

	public boolean hasNext() {
		if (index < employeeList.getLength() && index >= 0) {
			return true;
		} else {
			return false;
		}
	}

	public Object next() {
		Employee employee = employeeList.getEmployeeAt(index);
		index--;
		return employee;
	}
}

Classe d'exécution

Main.class


public class Main {
	public static void main(String[] args) {
		EmployeeList employeeList = new EmployeeList(4);
		employeeList.appendEmployee(new Employee("Tarou_Tanaka", "C001"));
		employeeList.appendEmployee(new Employee("Hanako_Yamada", "C002"));
		employeeList.appendEmployee(new Employee("Yuuya_Suzuki", "C003"));
		employeeList.appendEmployee(new Employee("Kanako_Satou", "C004"));
		Iterator it = employeeList.iterator();
		System.out.println("------- Order -------");
		while (it.hasNext()) {
			Employee employee = (Employee) it.next();
			System.out.println(employee.getName() + ":" + employee.getEmployeeCode());
		}
		System.out.println("------- Reverse Order -------");
		Iterator rit = employeeList.reverseIterator();
		while (rit.hasNext()) {
			Employee employee = (Employee) rit.next();
			System.out.println(employee.getName() + ":" + employee.getEmployeeCode());
		}
	}
}

Résultat d'exécution

Le résultat de l'exécution de «Main.class» est le suivant. Vous pouvez voir que la sortie est dans l'ordre ** ajouté à ʻemployeeList` et dans l'ordre inverse ** avec ceux ajoutés.

Résultat d'exécution


------- Order -------
Tarou_Tanaka:C001
Hanako_Yamada:C002
Yuuya_Suzuki:C003
Kanako_Satou:C004
------- Reverse Order -------
Kanako_Satou:C004
Yuuya_Suzuki:C003
Hanako_Yamada:C002
Tarou_Tanaka:C001

Résumé

Vous avez découvert le modèle Iterator, qui accède aux agrégats en séquence. L'exemple de code est téléchargé ci-dessous, veuillez donc vous y référer si vous le souhaitez.

En outre, d'autres modèles de conception sont résumés ci-dessous, veuillez donc vous y référer également.

Les références

Recommended Posts

Modèle d'itérateur en Java
Motif singleton en Java
Modèle de poids mouche en Java
Modèle d'observateur en Java
Modèle de décorateur en Java
Modèle de prototype en Java
Modèle de proxy en Java
Modèle de méthode de modèle en Java
Modèle de chaîne de responsabilité en Java
Itérateur dans MySQLdb
Apprenez le modèle de conception "Iterator" avec Python
Motif singleton en Python
Autorisations Linux sur Java
Utiliser DataFrame en Java
Modèle de visiteur en Python
J'ai écrit un modèle de conception en kotlin, édité par Iterator
Mettre en œuvre un test piloté par table en Java
Détectez et traitez les signaux en Java.
Implémenter le modèle Singleton en Python
5-1 Itérateur
Diviser l'itérateur en morceaux avec python
Mise en œuvre du tri à bulles en Java (BubbleSort)
Résumé du modèle de conception Java GoF
Chevauchement d'expressions régulières en Python et Java
Apprenez le modèle de conception "Prototype" avec Python
Apprenez le modèle de conception "Flyweight" en Python
Apprenez le modèle de conception "Memento" avec Python
Apprenez le modèle de conception "Proxy" en Python
Rendement Python express en JavaScript ou Java
Appliquer le formateur Google Java Style avec IntelliJ
Apprenez le modèle de conception "Commande" en Python
[Gang of Four] Apprentissage des modèles de conception - Itérateur
Différences entre la syntaxe Python et Java
Recevoir des e-mails à l'aide de l'API Gmail en Java
Apprenez le modèle de conception "Visiteur" avec Python
Apprenez le modèle de conception "Bridge" avec Python
Apprenez le modèle de conception "Mediator" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
Apprenez le modèle de conception «Stratégie» avec Python
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "État" en Python
Lançons le script Bash en Java
Apprenez le modèle de conception "Adapter" avec Python