معرفی الگوی طراحی Iterator

معرفی الگوی طراحی Iterator

مدت مطالعه : 4 دقیقه

26 اردیبهشت 1402

الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرم افزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفه جویی در زمان و تولید کد های با کیفیت، توسعه پذیر و انعطاف پذیر استفاده می‌کنیم. در این مطلب قصد داریم الگوی طراحی Iterator را معرفی کنیم.

الگوی طراحی Iterator یک الگوی رفتاری(behavioral) است که راهی برای پیمایش عناصر یک مجموعه به صورت یک به یک بدون توجه به جزئیات مجموعه را فراهم می کند. این الگو کپسوله‌سازی را ترویج می‌کند و اجازه می‌دهد تا ساختار داخلی مجموعه بدون تأثیر روی کد کلاینت تغییر کند. برای مثال در صورت تغییر ساختار مجموعه از آرایه به لیست، کد های کلاینت تغییری نخواهند کرد.

 

الگوی طراحی Iterator از چهار جزء اصلی تشکیل شده است:

  • Iterator: رابطی است که متد های دسترسی و پیمایش عناصر یک مجموعه را تعریف می کند.
  • Concrete Iterator: کلاسی است که رابط Iterator را پیاده سازی می کند و متد ها را بر اساس ساختار مجموعه تعریف می‌کند.
  • Aggregate: رابطی است که متدهای ایجاد یک شی Iterator را تعریف می کند.
  • Concrete Aggregate: کلاسی است که رابط Aggregate را پیاده سازی می کند و پیاده سازی را برای متدهای تعریف شده در رابط Aggregate فراهم می کند و یک شی Iterator ایجاد می کند که برای پیمایش مجموعه استفاده می شود.

در ادامه مثالی از الگوی Iterator در C# قرار گرفته است:

//Iterator interface
public interface IIterator
{
    bool HasNext();
    object Next();
}
//Concrete Iterator class
public class BookIterator : IIterator
{
    private readonly List<Book> _books;
    private int _position;
    public BookIterator(List<Book> books)
    {
        _books = books;
        _position = 0;
    }
    public bool HasNext()
    {
        return _position < _books.Count;
    }
    public object Next()
    {
        if (!HasNext())
            return null;
       
        var book = _books[_position];
        _position++;
        return book;
    }
}
//Aggregate interface
public interface IAggregate
{
    IIterator CreateIterator();
}
//Concrete Aggregate class
public class BookCollection : IAggregate
{
    private readonly List<Book> _books;
    public BookCollection()
    {
        _books = new List<Book>();
    }
    public void AddBook(Book book)
    {
        _books.Add(book);
    }
    public IIterator CreateIterator()
    {
        return new BookIterator(_books);
    }
}
//Book class
public class Book
{
    public string Title { get; set; }
    public string Author { get; set; }
}
//Client code
public class Client
{
    public void Main()
    {
        var bookCollection = new BookCollection();
        bookCollection.AddBook(new Book { Title = "The Catcher in the Rye", Author = "J.D. Salinger" });
        bookCollection.AddBook(new Book { Title = "To Kill a Mockingbird", Author = "Harper Lee" });
        bookCollection.AddBook(new Book { Title = "1984", Author = "George Orwell" });
        var iterator = bookCollection.CreateIterator();
        while (iterator.HasNext())
        {
            var book = iterator.Next() as Book;
            Console.WriteLine($"Title: {book.Title}, Author: {book.Author}");
        }
    }
}

در این مثال ابتدا یک رابط Iterator ایجاد می کنیم که متد های دسترسی و پیمایش عناصر مجموعه را تعریف می کند. سپس یک کلاس Concrete Iterator به نام BookIterator ایجاد می کنیم که رابط Iterator را پیاده سازی می کند. این کلاس یک مجموعه از کتاب ایجاد می کند و موقعیت فعلی را در حین تکرار در مجموعه نگهداری می کند.

سپس یک رابط Aggregate به نام IAggregate ایجاد می کنیم که متد ایجاد یک شی Iterator را تعریف می کند. 

در ادامه یک کلاس Concrete Aggregate به نام BookCollection ایجاد می کنیم که رابط IAggregate را پیاده سازی می کند. این کلاس فهرستی از کتاب ها را نگه می دارد و متدی برای افزودن کتاب ها به مجموعه ارائه می دهد. همچنین یک شی BookIterator ایجاد می کند که برای پیمایش مجموعه استفاده می شود.

در نهایت کد کلاینت با استفاده از کلاس BookCollection مجموعه ای از Book را ایجاد می‌کنیم و هر زمان که نیاز به پیمایش بر روی این مجموعه داشتیم، با استفاده از متد CreateIterator یک شی Iterator ایجاد می‌کنیم که امکانات پیمایش را در اختیار ما قرار می‌دهد.

 

برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همه‌ی الگو های طراحی می‌شود، برای شما قرار گرفته است.

design patterns

ایجاد کننده (Creational):الگوی طراحی Factory 
الگوی طراحی Builder 
الگوی طراحی Singleton 
الگوی طراحی Prototype 
الگوی طراحی Abstract Factory 
ساختاری (Structural):الگوی طراحی Adapter 
الگوی طراحی Bridge 
الگوی طراحی Composite 
الگوی طراحی Decorator 
الگوی طراحی Facade 
الگوی طراحی Flyweight 
الگوی طراحی Proxy 
رفتاری (Behavioral):الگوی طراحی Chain of Responsibility 
الگوی طراحی Command 
الگوی طراحی Interpreter 
الگوی طراحی Mediator 
الگوی طراحی Memento 
الگوی طراحی Observer 
الگوی طراحی State 
الگوی طراحی Strategy 
الگوی طراحی Template Method 
الگوی طراحی Visitor 
الگوی طراحی Iterator 
  • اشتراک گذاری:
محمدرضا باباخانی
محمدرضا باباخانی

من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که می‌نویسم بدردتون بخوره.

آخرین مطالب

سرویس مش؛ ساده سازی ارتباطات میکروسرویس و افزایش رؤیت پذیری

در چشم انداز همیشه در حال تحول توسعه نرم افزار، معماری میکروسرویس ها به دلیل مقیاس پذیری، انعطاف پذیری و توسعه پذیری محبوبیت قابل توجهی به دست آورده است. با این حال، با افزایش تعداد میکروسرویس ها در یک برنامه، مدیریت ارتباطات آنها و اطمینان از رؤیت صحیح همه آنها به طور فزاینده ای چالش برانگیز می شود. اینجاست که سرویس مش وارد عمل می شود.

اهمیت محاسبات لبه یا Edge Computing

ا توجه به سرعت تحول فناوری، یکی از مفاهیمی که توجه زیادی را به خود جلب کرده و نحوه تعامل ما با سیستم های دیجیتال را تغییر می دهد، محاسبات لبه (Edge Computing) است.

معماری رویداد محور چیست؟

معماری رویداد محور (EDA) یک الگوی طراحی نرم افزار است که در توسعه نرم افزار های مدرن به طور چشمگیری محبوب شده است. در این معماری، جریان داده ها با وقوع رویدادها تعیین می شود. بر خلاف سیستم های متمرکز سنتی که دائماً در حال بررسی وضعیت جدید هستند. معماری رویداد محور به ویژه برای سیستم هایی مفید است که به پردازش حجم زیادی از داده ها بصورت بلادرنگ(real-time) نیاز دارند.

ثبت دیدگاه