Wprowadzenie do wzorców projektowych
Część sekcji Programowanie obiektowe ścieżki C# w Coddy. Lekcja 51 z 70.
Wzorce projektowe to sprawdzone rozwiązania typowych problemów, z którymi programiści wielokrotnie się spotykają podczas tworzenia oprogramowania. Zamiast za każdym razem wymyślać koło na nowo, wzorce zapewniają nam wspólne słownictwo i sprawdzone podejścia do strukturyzowania kodu.
Myśl o wzorcach projektowych jak o planach. Nie podają dokładnego kodu do skopiowania, ale opisują, jak organizować klasy i obiekty, aby rozwiązywać konkretne problemy. Gdy ktoś mówi „użyj tutaj wzorca Factory”, doświadczeni programiści od razu rozumieją proponowaną ogólną strukturę.
Wzorce projektowe dzielą się na trzy główne kategorie:
| Kategoria | Cel | Przykłady |
|---|---|---|
| Kreacyjne | Jak tworzone są obiekty | Singleton, Factory |
| Strukturalne | Jak komponowane są obiekty | Adapter, Decorator |
| Czynnościowe | Jak komunikują się obiekty | Observer, Strategy |
Wzorce, które omówimy, bazują bezpośrednio na poznanych już koncepcjach OOP — interfejsach, dziedziczeniu, polimorfizmie i kompozycji. Każdy wzorzec wykorzystuje te podstawy w określony sposób, aby zapewnić elastyczność, łatwość utrzymania lub możliwość ponownego użycia.
W kolejnych lekcjach zaimplementujesz kilka podstawowych wzorców, zaczynając od Singleton, Factory, Observer i Strategy. Zrozumienie tych wzorców pomoże Ci rozpoznawać typowe rozwiązania w istniejących bazach kodu i podejmować lepsze decyzje architektoniczne we własnych projektach.
Wyzwanie
ŁatwyZbudujmy prosty system katalogu wzorców, który porządkuje informacje o wzorcach projektowych w wielu plikach. Pomoże ci to zrozumieć, jak kategoryzować wzorce, a jednocześnie ćwiczyć dobrą organizację kodu.
Utworzysz trzy pliki, aby rozdzielić różne zadania:
Pattern.cs: Zdefiniuj klasęPatternw przestrzeni nazwPatterns, która reprezentuje pojedynczy wzorzec projektowy. Każdy wzorzec powinien miećName,Category(Creational, Structural lub Behavioral) orazDescription. Dodaj metodęGetSummary(), która zwraca sformatowany ciąg znaków:[{Category}] {Name}: {Description}PatternCatalog.cs: Utwórz klasęPatternCatalogw przestrzeni nazwPatterns, która zarządza kolekcją wzorców. Katalog powinien umożliwiać dodawanie wzorców i zawierać metodęGetPatternsByCategory(string category), która zwraca listę wszystkich wzorców pasujących do danej kategorii. Dodaj też metodęGetAllSummaries(), która zwraca listę ciągów znaków z podsumowaniami wszystkich wzorców w katalogu.Program.cs: Połącz wszystko, tworząc katalog i wypełniając go wzorcami na podstawie danych wejściowych. Następnie wyświetl wzorce przefiltrowane według kategorii.
Otrzymasz następujące dane wejściowe:
- Liczba wzorców do dodania
- Dla każdego wzorca: trzy wiersze zawierające nazwę, kategorię i opis
- Kategoria, według której należy filtrować
Po dodaniu wszystkich wzorców do katalogu wypisz podsumowania wzorców pasujących do filtrowanej kategorii, po jednym w każdym wierszu. Jeśli żadne wzorce nie pasują, wypisz No patterns found.
Na przykład, jeśli dane wejściowe to:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
CreationalWynik powinien być następujący:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact classTo wyzwanie pokazuje, jak organizowanie powiązanych klas w osobnych plikach pomaga utrzymać porządek w bazie kodu i ułatwia jej konserwację — ta zasada staje się jeszcze ważniejsza, gdy w kolejnych lekcjach zaczniesz implementować rzeczywiste wzorce projektowe!
Spróbuj swoich sił
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// Odczytaj liczbę wzorców
int n = Convert.ToInt32(Console.ReadLine());
// Utwórz nowy PatternCatalog
PatternCatalog catalog = new PatternCatalog();
// TODO: Odczytaj szczegóły każdego wzorca (name, category, description)
// i dodaj je do katalogu
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO: Utwórz Pattern i dodaj go do katalogu
}
// Odczytaj kategorię, według której należy filtrować
string filterCategory = Console.ReadLine();
// TODO: Pobierz wzorce z wybranej kategorii
// i wypisz ich podsumowania
// Jeśli żadne wzorce nie pasują, wypisz "No patterns found"
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrznePrzestrzenie nazw i dyrektywyWprowadzenie do klas i obiektówSłowo kluczowe „this”Metody i parametryPola a właściwościKonstruktoryInicjalizatory obiektówPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawowa składnia dziedziczenia (:)Słowo kluczowe 'base'Słowa kluczowe virtual i overrideKlasy sealedBazowa klasa 'object'Powtórzenie – hierarchia pracowników7Zaawansowane funkcje
Przeciążanie operatorówIndeksery (this[])Nadpisywanie ToString()Metody rozszerzającePodsumowanie – własna lista10Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychSingleton bezpieczny wątkowoWzorzec fabrykiWzorzec obserwatora (zdarzenia)Wzorzec strategii2Właściwości i składowe statyczne
Właściwości automatyczneWłaściwości tylko do odczytu i zapisuPola i metody statyczneKlasy statyczneSkładowe z ciałem wyrażeniowym5Polimorfizm i interfejsy
Polimorfizm czasu kompilacji a czasu wykonaniaInterfejs a klasa abstrakcyjnaWiele interfejsówJawne implementowanie interfejsówRzutowanie w górę i w dółPowtórka — kalkulator kształtów8Zaawansowane koncepcje OOP
Kompozycja zamiast dziedziczeniaTypy generyczne (klasy i metody)Delegaty i zdarzeniaAtrybuty i refleksjaIDisposable i instrukcja usingPodstawy wstrzykiwania zależności11Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu3Architektura klas
Dane instancji a dane statyczneSłowa kluczowe 'readonly' i 'const'Pola zapasowePowtórzenie — menedżer kont bankowych6Hermetyzacja
Modyfikatory dostępuWłaściwości w hermetyzacjiImplementacja ukrywania danychWzorce niezmiennościPowtórka — dane studentów9Argumenty zmiennej liczby
Słowo kluczowe „params”Parametry opcjonalneArgumenty nazwanePrzeciążanie metodPoćwicz samodzielnie: Kompilator C# online