Qu'est-ce que le modèle d'itérateur
Définition : Fournit un moyen d'accéder séquentiellement aux éléments d'un objet agrégé sans exposer l'affichage interne de l'objet
Ce qui suit est le diagramme de structure du modèle d'itérateur :
L'exemple de code suivant a une brève compréhension :
//抽象聚合类 abstract class Aggregate { public abstract Iterator CreateIterator(); } //具体聚合类 class ConcreteAggregate : Aggregate { private IList<object> items = new List<object>(); public override Iterator CreateIterator() { return new ConcreteIterator(this); } public int Count { get { return items.Count; } } public object this[int index] { get { return items[index]; } set { items.Insert(index, value); } } } //抽象迭代器类 abstract class Iterator { public abstract object First(); public abstract object Next(); public abstract bool IsDone(); public abstract object CurrentItem(); } //具体迭代器类 class ConcreteIterator : Iterator { private ConcreteAggregate aggregate; private int Current = 0; public ConcreteIterator(ConcreteAggregate aggregate) { this.aggregate = aggregate; } public override object CurrentItem() { return aggregate[Current]; } public override object First() { return aggregate[0]; } public override bool IsDone() { return Current >= aggregate.Count ? true : false; } public override object Next() { object ret = null; Current++; if(Current<aggregate.Count) { ret = aggregate[Current]; } return ret; } } static void Main(string[] args) { ConcreteAggregate aggregate = new ConcreteAggregate(); aggregate[0] = "michael"; aggregate[1] = "jarle"; aggregate[2] = "cumming"; aggregate[3] = "andy"; ConcreteIterator iterator = new ConcreteIterator(aggregate); iterator.First(); while (!iterator.IsDone()) { Console.WriteLine($"{iterator.CurrentItem()},请打卡后再下班"); iterator.Next(); } Console.Read(); }
Analyse : Pensez-y, si nous mettons ensemble l'objet de collection et les opérations sur l'objet de collection, lorsque nous voulons parcourir les éléments de l'objet de collection d'une autre manière, nous devons modifier l'objet de collection, ce qui viole le " principe de responsabilité unique", et Le modèle d'itérateur sépare la structure des données et l'algorithme de la structure des données, et les deux peuvent être développés indépendamment.
Avantages :
1. Prend en charge plusieurs méthodes de traversée. Par exemple, dans une liste ordonnée, nous fournissons deux itérateurs pour le parcours direct et le parcours inverse selon les besoins. Les utilisateurs n'ont besoin que de demander à notre itérateur d'effectuer des opérations de parcours sur la collection
2. Classes d'agrégation simplifiées. En raison de l'introduction des itérateurs, l'objet de collection d'origine n'a pas besoin de parcourir les éléments de collection par lui-même
3. Il est très pratique d'ajouter de nouvelles classes d'agrégation et classes d'itérateur, et les deux dimensions peuvent être modifiées indépendamment.
4. Fournir une interface unifiée pour différentes structures de collection, prenant ainsi en charge le même algorithme pour fonctionner sur différentes structures de collection
Inconvénients :
1. Itération Le modèle d'itérateur sépare les responsabilités de stockage des données et de parcours des données. Lors de l'ajout d'un nouvel objet de collection, vous devez ajouter une classe d'itérateur correspondante. Le nombre de classes augmente par paires, ce qui augmente la complexité du système dans une certaine mesure
.Scénarios d'utilisation :
1. Accédez au contenu d'un objet agrégé sans exposer son affichage interne
2. Nécessité de fournir plusieurs méthodes de parcours pour l'objet agrégé.
3 .Fournir une interface unifiée pour parcourir différentes structures d'agrégats
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!