Wprowadzenie do wzorców projektowych
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 89 z 110.
Wzorce projektowe to sprawdzone rozwiązania typowych problemów, z którymi programiści wielokrotnie spotykają się podczas tworzenia oprogramowania. Zamiast za każdym razem wymyślać koło na nowo, możesz stosować te sprawdzone szablony, aby rozwiązywać podobne wyzwania w spójny i łatwy w utrzymaniu sposób.
Myśl o wzorcach projektowych jak o przepisach. Tak jak kucharz nie wymyśla za każdym razem nowego sposobu na pieczenie chleba, programiści korzystają ze wzorców, które udoskonalano przez dziesięciolecia. Wzorce te wykorzystują poznane już przez Ciebie koncepcje OOP — klasy, dziedziczenie, interfejsy i polimorfizm — i łączą je w określony sposób, aby rozwiązywać konkretne problemy.
Wzorce projektowe są zwykle grupowane w trzy kategorie:
| Kategoria | Cel | Przykłady |
|---|---|---|
| Kreacyjne | Sposób tworzenia obiektów | Singleton, Factory |
| Strukturalne | Sposób komponowania obiektów | Adapter, Decorator |
| Behawioralne | Sposób komunikowania się obiektów | Observer, Strategy |
W nadchodzących lekcjach poznasz konkretne wzorce z każdej kategorii. Każdy wzorzec rozwiązuje inny problem: zapewnia, że istnieje tylko jedna instancja klasy, umożliwia tworzenie obiektów bez określania dokładnych klas lub pozwala obiektom powiadamiać inne o zmianach. Zrozumienie, kiedy i dlaczego używać poszczególnych wzorców, jest równie ważne jak wiedza o tym, jak je implementować.
Wyzwanie
ŁatwyZbudujmy prosty system rozwiązywania problemów, który pokazuje, jak wzorce projektowe porządkują kod według kategorii! Utworzysz strukturę, która klasyfikuje różne wyzwania programistyczne i sugeruje, jaki typ wzorca może pomóc w ich rozwiązaniu.
Podzielisz kod na dwa pliki:
patterns.dart: Utwórz wyliczenie o nazwiePatternCategoryz trzema wartościami:creational,structuralibehavioral. Każda z nich powinna mieć poleString descriptionobjaśniające jej przeznaczenie:creational: "Handles object creation"structural: "Handles object composition"behavioral: "Handles object communication"
Problem, która reprezentuje wyzwanie programistyczne. Powinna mieć poleString namei polePatternCategory category. Dodaj metodęsuggest(), która zwraca ciąg znaków w formacie:[name] -> Use a [category description] patternmain.dart: Zaimportuj plik z wzorcami i pokaż, jak różne problemy są przyporządkowywane do różnych kategorii wzorców. Utwórz trzy instancje klasyProblem:- Problem o nazwie
Ensure single database connectionz kategoriącreational - Problem o nazwie
Make old API work with new systemz kategoriąstructural - Problem o nazwie
Notify users when data changesz kategoriąbehavioral
suggest()dla każdego problemu i wypisz wyniki.- Problem o nazwie
To wyzwanie pomoże ci zrozumieć, jak wzorce projektowe są kategoryzowane według rodzaju problemu, który rozwiązują — to kluczowe pojęcie, gdy w kolejnych lekcjach zaczniesz poznawać konkretne wzorce!
Oczekiwany wynik:
Ensure single database connection -> Use a Handles object creation pattern
Make old API work with new system -> Use a Handles object composition pattern
Notify users when data changes -> Use a Handles object communication patternSpróbuj swoich sił
import 'patterns.dart';
void main() {
// TODO: Utwórz trzy instancje klasy Problem:
// 1. name: "Ensure single database connection", category: creational
// 2. name: "Make old API work with new system", category: structural
// 3. name: "Notify users when data changes", category: behavioral
// TODO: Wywołaj suggest() dla każdego problemu i wypisz wyniki
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online