263 lines
7.0 KiB
C#
263 lines
7.0 KiB
C#
/* Итератор
|
||
Предоставляет способ последовательного
|
||
доступа к множеству, независимо от его
|
||
внутреннего устройства
|
||
*/
|
||
class Program
|
||
{
|
||
public static void Main(string[] args)
|
||
{
|
||
#region Пример №1 - базовое
|
||
Library library = new Library();
|
||
Reader reader = new Reader();
|
||
reader.SetBooks(library);
|
||
Console.ReadKey();
|
||
#endregion
|
||
#region Пример №2 - пример работы стека
|
||
DataStack stack = new DataStack();
|
||
for (int i = 0; i < 5; i++)
|
||
stack.Push(i);
|
||
|
||
DataStack stackCopy = new DataStack(stack);
|
||
|
||
Console.WriteLine(stack == stackCopy); //true
|
||
|
||
stackCopy.Push(10);
|
||
|
||
Console.WriteLine(stack == stackCopy); //false
|
||
#endregion
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Читатель
|
||
/// </summary>
|
||
class Reader
|
||
{
|
||
public void SetBooks(Library library)
|
||
{
|
||
IBookIterator iterator = library.CreateNumerator();
|
||
while(iterator.HasNext())
|
||
{
|
||
Book book = iterator.Next();
|
||
Console.WriteLine(book.Name);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Поведение поиска библиотеки
|
||
/// </summary>
|
||
interface IBookIterator
|
||
{
|
||
bool HasNext();
|
||
Book Next();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Поведение библиотеки
|
||
/// </summary>
|
||
interface IBookNumerable
|
||
{
|
||
IBookIterator CreateNumerator();
|
||
int Count { get; }
|
||
Book this[int index] { get; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// Класс книги
|
||
/// </summary>
|
||
class Book
|
||
{
|
||
public string Name { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// Класс библиотеки книг
|
||
/// </summary>
|
||
class Library : IBookNumerable
|
||
{
|
||
private Book[] Books { get; set; }
|
||
|
||
public Library()
|
||
{
|
||
Books = new Book[]
|
||
{
|
||
new Book(){ Name = "James"},
|
||
new Book(){ Name = "Karl"},
|
||
new Book(){ Name = "Rogan"}
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// Вызов книги
|
||
/// </summary>
|
||
/// <param name="index">индекс в библиотеке</param>
|
||
/// <returns>Book</returns>
|
||
public Book this[int index] => Books[index];
|
||
|
||
/// <summary>
|
||
/// Количество книг в библиотеке
|
||
/// </summary>
|
||
public int Count => Books.Length;
|
||
|
||
/// <summary>
|
||
/// Перейти к следующей библиотеке
|
||
/// </summary>
|
||
/// <returns>IBookIterator(LibraryNumenator)</returns>
|
||
public IBookIterator CreateNumerator() => new LibraryNumenator(this);
|
||
}
|
||
|
||
class LibraryNumenator : IBookIterator
|
||
{
|
||
IBookNumerable Aggregate { get; set; }
|
||
int index = 0;
|
||
|
||
/// <summary>
|
||
/// Передача коллекции книг в Library
|
||
/// </summary>
|
||
/// <param name="bookNumerable"></param>
|
||
public LibraryNumenator(IBookNumerable bookNumerable)
|
||
{
|
||
Aggregate = bookNumerable;
|
||
}
|
||
|
||
public bool HasNext() => index < Aggregate.Count;
|
||
|
||
public Book Next() => Aggregate[index++];
|
||
}
|
||
|
||
/// <summary>
|
||
/// Класс стека данных
|
||
/// </summary>
|
||
public class DataStack
|
||
{
|
||
private int[] items = new int[10];
|
||
/// <summary>
|
||
/// Длинна массива данных в этом стеке
|
||
/// </summary>
|
||
private int lenght;
|
||
|
||
public DataStack() => lenght = -1;
|
||
|
||
/// <summary>
|
||
/// Для копирования экземпляра класса
|
||
/// </summary>
|
||
/// <param name="myStack">Экземпляр данного класса</param>
|
||
public DataStack(DataStack myStack)
|
||
{
|
||
this.items = myStack.items;
|
||
this.lenght = myStack.lenght;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Свойство геттера для поля items
|
||
/// </summary>
|
||
public int[] Items { get => items; }
|
||
|
||
/// <summary>
|
||
/// Свойство геттера для поля lenght
|
||
/// </summary>
|
||
public int Lenght { get => lenght; }
|
||
|
||
/// <summary>
|
||
/// Добавление элементов в массив
|
||
/// </summary>
|
||
/// <param name="value">значение</param>
|
||
public void Push(int value) => items[++lenght] = value;
|
||
|
||
/// <summary>
|
||
/// Получение последнего элемента
|
||
/// </summary>
|
||
/// <returns>значение</returns>
|
||
public int Pop() => items[lenght--];
|
||
|
||
/// <summary>
|
||
/// Переопределение оператора сравнения двух экземпляров данного класса
|
||
/// </summary>
|
||
/// <param name="left"></param>
|
||
/// <param name="right"></param>
|
||
/// <returns>bool</returns>
|
||
public static bool operator ==(DataStack left, DataStack right)
|
||
{
|
||
StackIterator it1 = new StackIterator(left),
|
||
it2 = new StackIterator(right);
|
||
|
||
while (it1.IsEnd() || it2.IsEnd())
|
||
{
|
||
if (it1.Get() != it2.Get()) break;
|
||
it1++;
|
||
it2++;
|
||
}
|
||
|
||
return !it1.IsEnd() && !it2.IsEnd();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Переопределение оператора сравнения двух экземпляров данного класса
|
||
/// </summary>
|
||
/// <param name="left"></param>
|
||
/// <param name="right"></param>
|
||
/// <returns>bool</returns>
|
||
public static bool operator !=(DataStack left, DataStack right)
|
||
{
|
||
StackIterator it1 = new StackIterator(left),
|
||
it2 = new StackIterator(right);
|
||
|
||
while (it1.IsEnd() || it2.IsEnd())
|
||
{
|
||
if (it1.Get() != it2.Get()) break;
|
||
it1++;
|
||
it2++;
|
||
}
|
||
|
||
return !it1.IsEnd() && !it2.IsEnd();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Перечислитель
|
||
/// </summary>
|
||
class StackIterator
|
||
{
|
||
private DataStack stack;
|
||
private int index;
|
||
|
||
/// <summary>
|
||
/// Инициализируем поля перечислителя
|
||
/// </summary>
|
||
/// <param name="dataStack">данные</param>
|
||
public StackIterator(DataStack dataStack)
|
||
{
|
||
this.stack = dataStack;
|
||
this.index = 0;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Переопределение опреатора инкрементирования
|
||
/// </summary>
|
||
/// <param name="s">новый переданный экземпляр класса</param>
|
||
/// <returns>экземпляр класса с инкрементированым значением index</returns>
|
||
public static StackIterator operator ++(StackIterator s)
|
||
{
|
||
s.index++;
|
||
return s;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Возвращает значение элемента поля стека
|
||
/// через его свойство по текущему индексу
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public int Get()
|
||
{
|
||
if(index < stack.Lenght) return stack.Items[index];
|
||
return 0;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Возвращет true при достижении предельного размера стека
|
||
/// </summary>
|
||
/// <returns>bool</returns>
|
||
public bool IsEnd() => index != stack.Lenght + 1;
|
||
} |