نمط المكرر

نمط المكرّر iterator pattern هو أحد الأنماط السلوكية[1] في أنماط تصميم البرمجيات، يُستخدم فيه مكرر والذي بدوره يُستخدم للنفاذ (traverse) إلى الحاويات البرمجية والوصول إلى عناصر الحاوية. يفصل نمط التكرار الخوارزميات عن الحاويات؛ في بعض الحالات، تكون الخوارزميات ضرورية للحاويات وبالتالي لا يمكن فصلها.

على سبيل المثال، يمكن تنفيذ الخوارزمية الافتراضية البحث عن عنصر SearchForElement بشكل عام باستخدام نوع محدد من المكرّر بدلاً من تنفيذه كخوارزمية خاصة بالحاويات. يسمح هذا باستخدام SearchForElement على أي حاوية تدعم نوع المكرر المطلوب.

تعريف

جوهر نمط المكرر هو «توفير طريقة للوصول إلى عناصر كائن مركّب بالتسلسل دون الكشف عن تمثيله الأساسي.».[2]

هيكل

مخطط الصنف UML ومخطط التتابع

نموذج لصنف UML ومخطط التتابع لنمط المكرر.[3]

في مخطط الصنف UML أعلاه، صنف Client يشير (1) إلى واجهة (التراكيب) Aggregate لإنشاء كائن Iterator (createIterator()) و (2) إلى واجهة Iterator للنقاذ في كائن Aggregate (next(),hasNext()). وصنفIterator1 ينفذ واجهة Iterator عن طريق الوصول إلى الصف Aggregate1 .

يُظهر مخطط الصنف UML تفاعلات وقت التشغيل: يستدعي كائن Client الطريقة «إنشاء-مكرر» ()createIterator على كائن «تراكيب-1» Aggregate1 ، الذي ينشئ كائن Iterator1 ويعيده إلى Client. يستخدم Client ثم Iterator1 للنفاذ إلى عناصر كائن Aggregate1 .

مخطط الصنف UML

نمط المكرر

أمثلة للتنفيذات في لغات البرمجة

جافا

تحتوي Java على واجهة Iterator .

مثال بسيط يوضح كيفية إرجاع الأعداد الصحيحة بين البداية والنهاية [start، end] باستخدام المكرر Iterator

import java.util.Iterator;
import java.util.NoSuchElementException;
 
public class RangeIteratorExample {
  public static Iterator<Integer> range(int start, int end) {
    return new Iterator<>() {
      private int index = start;
   
      @Override
      public boolean hasNext() {
        return index < end;
      }

      @Override
      public Integer next() {
        if (!hasNext()) {
          throw new NoSuchElementException();
        }
        return index++;
      }
    };
  }
  
  public static void main(String[] args) {
    var iterator = range(0, 10);
    while (iterator.hasNext()) {
      System.out.println(iterator.next());
    }
    
    // or using a lambda
    iterator.forEachRemaining(System.out::println);
  }
}

بدءأ من Java 5، يمكن النفاذ إلى الكائنات التي تقوم بتنفيذ واجهة (يمكن تكريره) Iterable ، والتي تُرجع (المكرر) Iterator من طريقت</>ها الوحيدة، باستخدام البناء النحوي للحلقة foreach في جافا. تمتد واجهة (التجميعات) Collection من جافا Java collections framework</>إلى Iterable . مثال على تنفيذ صنف Family للواجهة Iterable :

import java.util.Iterator;
import java.util.Set;

class Family<E> implements Iterable<E> {
  private final Set<E> elements;
  
  public Family(Set<E> elements) {
    this.elements = Set.copyOf(elements);
  }
  
  @Override
  public Iterator<E> iterator() {
    return elements.iterator();
  }
}

يوضح الصنف («مثال-يمكن-تكريره») IterableExample استخدام الصنف «عائلة» Family :

public class IterableExample {
  public static void main(String[] args) {
    var weasleys = Set.of(
      "Arthur", "Molly", "Bill", "Charlie",
      "Percy", "Fred", "George", "Ron", "Ginny"
      );
    var family = new Family<>(weasleys);
  
    for (var name : family) {
      System.out.println(name + " Weasley");
    }
  }
}

مخرجات:

Ron Weasley
Molly Weasley
Percy Weasley
Fred Weasley
Charlie Weasley
George Weasley
Arthur Weasley
Ginny Weasley
Bill Weasley


انظر أيضًا

المراجع

  1. Erich؛ Helm, Richard؛ Johnson, Ralph؛ Vlissides, John (31 أكتوبر 1994)، Design Patterns: Elements of Reusable Object-Oriented Software (باللغة الإنجليزية)، Pearson Education، ISBN 978-0-321-70069-8، مؤرشف من الأصل في 28 يونيو 2020.
  2. خطط التصميم
  3. "The Iterator design pattern - Structure and Collaboration"، w3sDesign.com، مؤرشف من الأصل في 28 يونيو 2020، اطلع عليه بتاريخ 12 أغسطس 2017.

روابط خارجية

  • بوابة برمجة الحاسوب
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.