Modèle comportemental: analyse du modèle d'itérateur

ITERATEUR

Aujourd'hui est le dixième article de la série d'apprentissage des modèles de conception. Ce que je veux apprendre aujourd'hui, c'est le modèle d'itération .

Commencez par des questions

  1. Quel est le modèle d'itérateur?
  2. Quel problème l'itérateur résout-il?
  3. Scène applicable?

définition

Le modèle d'itérateur fournit un moyen d'accéder séquentiellement aux éléments d'un objet agrégé sans exposer sa représentation interne.

Insérez la description de l'image ici

problème

Un objet agrégé, tel qu'une liste, un tableau, une arborescence, etc., doit permettre à d'autres d'accéder à ses éléments sans exposer la structure interne. De plus, pour des besoins différents, l'objet agrégé peut être traversé de différentes manières. Cependant, étant donné que la structure interne de l'objet agrégé est différente et que la méthode de traversée est différente, cela causera une grande gêne à l'utilisateur, car différents codes doivent être écrits pour différents objets agrégés.

Le modèle d'itérateur peut vous aider à résoudre ce problème. L'idée clé de ce modèle est de séparer l'accès et le parcours de la liste de l'objet liste et de le placer dans un itérateur . La classe iterator définit une interface pour accéder aux éléments agrégés. L'itérateur est responsable du suivi de l'élément courant, c'est-à-dire qu'il sait quels éléments ont été traversés.

Par exemple, aujourd'hui, vous devez utiliser l'algorithme de profondeur d'abord pour traverser la structure arborescente, demain, vous aurez peut-être besoin de l'algorithme de largeur d'abord; la semaine prochaine, vous aurez peut-être besoin d'autres méthodes (comme l'accès aléatoire aux éléments de l'arborescence).

D'un autre côté, le code client qui utilise plusieurs collections peut ne pas se soucier de la façon dont les données sont stockées. Cependant, étant donné que les collections fournissent différentes manières d'accéder aux éléments, votre code devra être couplé à des classes de collection spécifiques.

Solution

À ce stade, vous pouvez avoir besoin d'un objet itérateur, la relation entre eux est la suivante:

Insérez la description de l'image ici

Avant d'instancier l'itérateur, l'objet agrégé à parcourir doit être fourni. Une fois que vous avez une instance de l'itérateur d'objet agrégé, vous pouvez accéder séquentiellement aux éléments de la liste.

Diagramme de classe de modèle d'itérateur

Insérez la description de l'image ici

La figure ci-dessus montre également que pour rendre le code client non dépendant de l'objet d'agrégation spécifique, le client ne peut pas simplement instancier un itérateur de création par lui-même, mais laisser l'objet d'agrégation être responsable de la création de l'itérateur correspondant. Ainsi, l'objet de collection fournit une opération comme createIterator.

Il est à noter que la création d'itérateurs ici est un mode Factory Method, l'avez-vous découvert?

applicabilité

Le modèle d'itérateur peut être utilisé pour:

  • Accéder au contenu d'un objet agrégé sans exposer sa représentation interne;
  • Prend en charge la traversée multiple des objets agrégés;
  • Fournir une interface unifiée pour traverser différentes structures d'agrégation (c'est-à-dire prendre en charge l'itération polymorphe);

Les avantages

  1. Il prend en charge la traversée d'une collection de différentes manières. Les agrégations complexes peuvent être traversées de plusieurs manières. Par exemple, la génération de code et la vérification sémantique doivent traverser l'arbre d'analyse syntaxique. La génération de code peut parcourir l'arborescence d'analyse dans l'ordre intermédiaire ou en précommande. Le modèle d'itérateur facilite la modification de l'algorithme de parcours: remplacez simplement l'instance précédente par une autre instance d'itérateur. Vous pouvez également définir vos propres sous-classes d'itérateurs pour prendre en charge de nouvelles traversées.
  2. Les itérateurs simplifient l'interface d'agrégation. Avec l'interface de traversée des itérateurs, l'agrégation elle-même n'a plus besoin d'une interface de traversée similaire.
  3. Il peut y avoir plusieurs traversées sur la même agrégation. Chaque itérateur conserve son propre état de parcours. Ainsi, vous pouvez implémenter plusieurs traversées en même temps.

atteindre

Si nous voulons montrer les besoins de toutes les majeures dans tous les départements d'une école, chaque département est indépendant, ce qui signifie que la structure de données utilisée par chaque département peut être différente. Ensuite, nous utiliserons le modèle d'itérateur pour réaliser, jetons un coup d'œil ensemble.

public class Client {
    
    

	public static void main(String[] args) {
    
    
		// TODO Auto-generated method stub
		//创建学院
		List<College> collegeList = new ArrayList<College>();
		
		ComputerCollege computerCollege = new ComputerCollege();
		InfoCollege infoCollege = new InfoCollege();
		
		collegeList.add(computerCollege);
		//collegeList.add(infoCollege);
		
		OutPutImpl outPutImpl = new OutPutImpl(collegeList);
		outPutImpl.printCollege();
	}

}
public interface College {
    
    
	
	public String getName();
	
	//增加系的方法
	public void addDepartment(String name, String desc);
	
	//返回一个迭代器,遍历
	public Iterator  createIterator();
}
public class ComputerCollege implements College {
    
    

	Department[] departments;
	int numOfDepartment = 0 ;// 保存当前数组的对象个数
	
	
	public ComputerCollege() {
    
    
		departments = new Department[5];
		addDepartment("Java专业", " Java专业 ");
		addDepartment("PHP专业", " PHP专业 ");
		addDepartment("大数据专业", " 大数据专业 ");
		
	}
	
	
	@Override
	public String getName() {
    
    
		// TODO Auto-generated method stub
		return "计算机学院";
	}

	@Override
	public void addDepartment(String name, String desc) {
    
    
		// TODO Auto-generated method stub
		Department department = new Department(name, desc);
		departments[numOfDepartment] = department;
		numOfDepartment += 1;
	}

	@Override
	public Iterator createIterator() {
    
    
		// TODO Auto-generated method stub
		return new ComputerCollegeIterator(departments);
	}

}
public class ComputerCollegeIterator implements Iterator {
    
    

	//这里我们需要Department 是以怎样的方式存放=>数组
	Department[] departments;
	int position = 0; //遍历的位置

	public ComputerCollegeIterator(Department[] departments) {
    
    
		this.departments = departments;
	}

	//判断是否还有下一个元素
	@Override
	public boolean hasNext() {
    
    
		// TODO Auto-generated method stub
		if(position >= departments.length || departments[position] == null) {
    
    
			return false;
		}else {
    
    
		
			return true;
		}
	}

	@Override
	public Object next() {
    
    
		// TODO Auto-generated method stub
		Department department = departments[position];
		position += 1;
		return department;
	}	
	//删除的方法,默认空实现
	public void remove() {
    
    
		
	}
}
public class Department {
    
    

	private String name;
	private String desc;
	public Department(String name, String desc) {
    
    
		super();
		this.name = name;
		this.desc = desc;
	}
	public String getName() {
    
    
		return name;
	}
	public void setName(String name) {
    
    
		this.name = name;
	}
	public String getDesc() {
    
    
		return desc;
	}
	public void setDesc(String desc) {
    
    
		this.desc = desc;
	}
}

public class InfoColleageIterator implements Iterator {
    
    

	
	List<Department> departmentList; // 信息工程学院是以List方式存放系
	int index = -1;//索引
	

	public InfoColleageIterator(List<Department> departmentList) {
    
    
		this.departmentList = departmentList;
	}

	//判断list中还有没有下一个元素
	@Override
	public boolean hasNext() {
    
    
		// TODO Auto-generated method stub
		if(index >= departmentList.size() - 1) {
    
    
			return false;
		} else {
    
    
			index += 1;
			return true;
		}
	}
	@Override
	public Object next() {
    
    
		// TODO Auto-generated method stub
		return departmentList.get(index);
	}
	//空实现remove
	public void remove() {
    
    
		
	}
}
public class InfoCollege implements College {
    
    

	List<Department> departmentList;
	
	
	public InfoCollege() {
    
    
		departmentList = new ArrayList<Department>();
		addDepartment("信息安全专业", " 信息安全专业 ");
		addDepartment("网络安全专业", " 网络安全专业 ");
		addDepartment("服务器安全专业", " 服务器安全专业 ");
	}
	
	@Override
	public String getName() {
    
    
		// TODO Auto-generated method stub
		return "信息工程学院";
	}

	@Override
	public void addDepartment(String name, String desc) {
    
    
		// TODO Auto-generated method stub
		Department department = new Department(name, desc);
		departmentList.add(department);
	}

	@Override
	public Iterator createIterator() {
    
    
		// TODO Auto-generated method stub
		return new InfoColleageIterator(departmentList);
	}
}
public class OutPutImpl {
    
    
	
	//学院集合
	List<College> collegeList;

	public OutPutImpl(List<College> collegeList) {
    
    
		
		this.collegeList = collegeList;
	}
	//遍历所有学院,然后调用printDepartment 输出各个学院的系
	public void printCollege() {
    
    
		
		//从collegeList 取出所有学院, Java 中的 List 已经实现Iterator
		Iterator<College> iterator = collegeList.iterator();
		
		while(iterator.hasNext()) {
    
    
			//取出一个学院
			College college = iterator.next();
			System.out.println("=== "+college.getName() +"=====" );
			printDepartment(college.createIterator()); //得到对应迭代器
		}
	}
	
	//输出 学院输出 系
	
	public void printDepartment(Iterator iterator) {
    
    
		while(iterator.hasNext()) {
    
    
			Department d = (Department)iterator.next();
			System.out.println(d.getName());
		}
	}
}


Cet article implique également un principe de conception de base: responsabilité unique , une classe ne doit avoir qu'une seule cause de changement.

L'apprentissage des modèles de conception doit être pratiqué avant de pouvoir les maîtriser. J'espère qu'après avoir compris l'idée du modèle, vous pourrez y réfléchir dans votre code habituel. Beaucoup de gens se plaignent qu'il n'y a pas de contenu de travail dans le travail. Crud toute la journée, en fait, vous pourriez aussi bien utiliser le modèle de conception. Optimisez votre code pour commencer.

Fin de cet article! combat

Compte public personnel

Insérez la description de l'image ici

  • Les amis qui sentent qu'ils écrivent bien peuvent se donner la peine d'aimer et de suivre ;
  • Si l'article est incorrect, veuillez le signaler, merci beaucoup pour la lecture;
  • Je recommande à tout le monde de faire attention à mon compte officiel, et je vais régulièrement pousser des articles originaux de produits secs pour vous et vous attirer dans la communauté d'apprentissage de haute qualité;
  • Adresse github: github.com/coderluojust/qige_blogs

Je suppose que tu aimes

Origine blog.csdn.net/taurus_7c/article/details/107649552
conseillé
Classement