Last active
January 13, 2026 20:21
-
-
Save sunmeat/a81a15055d6e690132e9aa8ea2150e4c to your computer and use it in GitHub Desktop.
OCP nice example C#
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System.Text; | |
| class Product | |
| { | |
| public string? Name { get; set; } | |
| public decimal Price { get; set; } | |
| } | |
| class Order | |
| { | |
| private List<Product> items = new List<Product>(); | |
| // робота з замовленням | |
| public void Calculate() | |
| { | |
| decimal total = 0; | |
| foreach (var item in items) | |
| { | |
| total += item.Price; | |
| } | |
| Console.WriteLine($"Загальна сума: {total}"); | |
| } | |
| public void AddItem(Product product) | |
| { | |
| items.Add(product); | |
| Console.WriteLine("Елемент додано!"); | |
| } | |
| public Product[] GetItems() | |
| { | |
| return items.ToArray(); | |
| } | |
| } | |
| // інтерфейс генерації звітів !!! | |
| interface IReportable | |
| { | |
| string GenerateReport(Order order); | |
| } | |
| // генерація pdf-звіту | |
| class PDFReporter : IReportable | |
| { | |
| public string GenerateReport(Order order) | |
| { | |
| var data = "Звіт PDF\n"; | |
| data += "------------\n"; | |
| decimal total = 0; | |
| foreach (var item in order.GetItems()) | |
| { | |
| data += $"{item.Name}: {item.Price}\n"; | |
| total += item.Price; | |
| } | |
| data += $"Загальна сума: {total}\n"; | |
| return data; | |
| } | |
| } | |
| // генерація excel-звіту | |
| class ExcelReporter : IReportable | |
| { | |
| public string GenerateReport(Order order) | |
| { | |
| var data = "Звіт Excel\n"; | |
| data += "-----------\n"; | |
| decimal total = 0; | |
| foreach (var item in order.GetItems()) | |
| { | |
| data += $"{item.Name}\t{item.Price}\n"; | |
| total += item.Price; | |
| } | |
| data += $"Загальна сума\t{total}\n"; | |
| return data; | |
| } | |
| } | |
| // готовий клас, в який зміни вносити більше не доведеться | |
| class PrintManager | |
| { | |
| public void Print(Order order, IReportable reporter) | |
| { | |
| Console.WriteLine(reporter.GenerateReport(order)); | |
| } | |
| } | |
| class Program | |
| { | |
| static void Main() | |
| { | |
| Console.OutputEncoding = Encoding.UTF8; | |
| var product1 = new Product { Name = "Книга", Price = 200m }; | |
| var product2 = new Product { Name = "Зошит", Price = 50m }; | |
| var order = new Order(); | |
| order.AddItem(product1); | |
| order.AddItem(product2); | |
| order.Calculate(); | |
| var printManager = new PrintManager(); | |
| var pdfReporter = new PDFReporter(); | |
| printManager.Print(order, pdfReporter); | |
| var excelReporter = new ExcelReporter(); | |
| printManager.Print(order, excelReporter); | |
| var items = order.GetItems(); | |
| Console.WriteLine($"Кількість елементів: {items.Length}"); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment