Advertisement
multifacs

final test internal iter

Dec 6th, 2024
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.42 KB | Source Code | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. // Интерфейс стратегии вычисления
  6. public interface ICalculationStrategy
  7. {
  8.     int Calculate(int prev1, int prev2);
  9. }
  10.  
  11. // Конкретная стратегия вычисления квадрата разности
  12. public class SquareDifferenceStrategy : ICalculationStrategy
  13. {
  14.     public int Calculate(int prev1, int prev2)
  15.     {
  16.         return (prev1 - prev2) * (prev1 - prev2);
  17.     }
  18. }
  19.  
  20. // Декоратор стратегии для изменения знака
  21. public class NegativeDecorator : ICalculationStrategy
  22. {
  23.     private readonly ICalculationStrategy _strategy;
  24.  
  25.     public NegativeDecorator(ICalculationStrategy strategy)
  26.     {
  27.         _strategy = strategy;
  28.     }
  29.  
  30.     public int Calculate(int prev1, int prev2)
  31.     {
  32.         return -_strategy.Calculate(prev1, prev2);
  33.     }
  34. }
  35.  
  36. // Основной класс последовательности с внутренним итератором
  37. public class Sequence : IEnumerable<int>
  38. {
  39.     private readonly int _x0;
  40.     private readonly int _x1;
  41.     private readonly int _n;
  42.     private readonly ICalculationStrategy _strategy;
  43.  
  44.     public Sequence(int x0, int x1, int n, ICalculationStrategy strategy)
  45.     {
  46.         _x0 = x0;
  47.         _x1 = x1;
  48.         _n = n;
  49.         _strategy = strategy;
  50.     }
  51.  
  52.     // Внутренний итератор с использованием yield return
  53.     public IEnumerator<int> GetEnumerator()
  54.     {
  55.         if (_n <= 0) yield break;
  56.  
  57.         // Возвращаем первый элемент
  58.         yield return _x0;
  59.         if (_n == 1) yield break;
  60.  
  61.         // Возвращаем второй элемент
  62.         yield return _x1;
  63.         if (_n == 2) yield break;
  64.  
  65.         int prev2 = _x0;
  66.         int prev1 = _x1;
  67.  
  68.         // Генерируем остальные элементы последовательности
  69.         for (int i = 2; i < _n; i++)
  70.         {
  71.             int current = _strategy.Calculate(prev1, prev2);
  72.             yield return current;
  73.             prev2 = prev1;
  74.             prev1 = current;
  75.         }
  76.     }
  77.  
  78.     IEnumerator IEnumerable.GetEnumerator()
  79.     {
  80.         return GetEnumerator();
  81.     }
  82. }
  83.  
  84. // Дополнительная стратегия суммирования
  85. public class SumStrategy : ICalculationStrategy
  86. {
  87.     public int Calculate(int prev1, int prev2)
  88.     {
  89.         return prev1 + prev2;
  90.     }
  91. }
  92.  
  93. // Дополнительный декоратор умножения на 2
  94. public class MultiplyByTwoDecorator : ICalculationStrategy
  95. {
  96.     private readonly ICalculationStrategy _strategy;
  97.  
  98.     public MultiplyByTwoDecorator(ICalculationStrategy strategy)
  99.     {
  100.         _strategy = strategy;
  101.     }
  102.  
  103.     public int Calculate(int prev1, int prev2)
  104.     {
  105.         return 2 * _strategy.Calculate(prev1, prev2);
  106.     }
  107. }
  108.  
  109. class Program
  110. {
  111.     static void Main()
  112.     {
  113.         // Тест базовой последовательности
  114.         Console.WriteLine("Original sequence:");
  115.         var sequence = new Sequence(0, 2, 10, new SquareDifferenceStrategy());
  116.         foreach (var number in sequence)
  117.         {
  118.             Console.Write($"{number} ");
  119.         }
  120.         Console.WriteLine();
  121.  
  122.         // Тест последовательности с отрицательным декоратором
  123.         Console.WriteLine("\nSequence with negative decorator:");
  124.         var decoratedSequence = new Sequence(0, 2, 10,
  125.             new NegativeDecorator(new SquareDifferenceStrategy()));
  126.         foreach (var number in decoratedSequence)
  127.         {
  128.             Console.Write($"{number} ");
  129.         }
  130.         Console.WriteLine();
  131.  
  132.         // Тест последовательности с множественными декораторами
  133.         Console.WriteLine("\nSequence with multiple decorators:");
  134.         var complexSequence = new Sequence(0, 2, 10,
  135.             new MultiplyByTwoDecorator(
  136.                 new NegativeDecorator(
  137.                     new SquareDifferenceStrategy())));
  138.         foreach (var number in complexSequence)
  139.         {
  140.             Console.Write($"{number} ");
  141.         }
  142.         Console.WriteLine();
  143.  
  144.         // Демонстрация работы с другой стратегией (числа Фибоначчи)
  145.         Console.WriteLine("\nFibonacci sequence:");
  146.         var fibonacciSequence = new Sequence(0, 1, 10, new SumStrategy());
  147.         foreach (var number in fibonacciSequence)
  148.         {
  149.             Console.Write($"{number} ");
  150.         }
  151.         Console.WriteLine();
  152.     }
  153. }
  154.  
  155. //Основные отличия от предыдущей версии:
  156.  
  157. //Убран отдельный класс итератора (SequenceIterator).
  158. //Логика итерации перенесена непосредственно в метод GetEnumerator класса Sequence.
  159. //Использование yield return для упрощения кода итерации.
  160. //Преимущества этого подхода:
  161.  
  162. //Код стал более компактным и читаемым
  163. //Меньше служебного кода
  164. //Внутренний итератор автоматически управляет состоянием
  165. //Логика генерации последовательности сосредоточена в одном месте
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement