Sprawdzone rozwiązania powtarzających się problemów w projektowaniu aplikacji.
Programiści na całym świecie rozwiązują te same problemy: jak tworzyć obiekty, jak łączyć klasy, jak powiadamiać o zmianach.
Wzorzec projektowy to sprawdzone w praktyce rozwiązanie problemu projektowania oprogramowania. Zwykle jest to szkic klas i powiązań między nimi.
gotowy schemat zamiast pustej kartki
zmiany w jednym miejscu, bez efektu domina
także gdy w projekcie zmieniają się programiści
Architekt opisuje 253 wzorce budowania miast i domów – pomysł „języka wzorców”.
Gamma, Helm, Johnson, Vlissides wydają książkę „Design Patterns” – 23 wzorce obiektowe.
Korzystają z nich m.in. tkinter, kivy, matplotlib, Django, Android.
Krótka etykieta, dzięki której zespół szybko się rozumie: „zróbmy tu fasadę”.
Kiedy stosować wzorzec? Jaka sytuacja w projekcie go wymaga?
Jakie klasy i powiązania tworzymy – szkic, nie gotowy kod.
Zalety i koszty: co zyskujemy, a co się komplikuje.
Jak tworzyć obiekty?
Ukrywają szczegóły tworzenia obiektów.
fabryka · budowniczy · singleton
Jak łączyć klasy?
Opisują, jak składać klasy i obiekty w większe struktury.
fasada · adapter · kompozyt
Jak obiekty współpracują?
Opisują komunikację i podział odpowiedzialności.
metoda szablonowa · obserwator · mediator
| Wzorzec | Grupa | Co robi |
|---|---|---|
| Fabryka | K | Tworzy obiekty bez podawania konkretnej klasy |
| Budowniczy | K | Składa złożony obiekt krok po kroku |
| Fasada | S | Prosty interfejs do złożonego systemu |
| Adapter | S | Dopasowuje niezgodny interfejs do oczekiwanego |
| Kompozyt | S | Drzewo obiektów traktowane jak jeden obiekt |
| Metoda szablonowa | B | Stały szkielet algorytmu, kroki nadpisują podklasy |
| Obserwator | B | Powiadamia subskrybentów o zmianie stanu |
| Mediator | B | Obiekty komunikują się przez pośrednika |
K – kreacyjny · S – strukturalny · B – behawioralny
Recepcja w hotelu – jedna osoba załatwia pokój, sprzątanie i taksówkę.
Przejściówka do gniazdka – wtyczka z UK działa w polskim gniazdku bez przeróbek.
Subskrypcja kanału – kanał publikuje film, wszyscy subskrybenci dostają powiadomienie.
Zestaw w restauracji – zamówienie krok po kroku: kanapka, dodatek, napój.
Wieża kontroli lotów – samoloty nie rozmawiają ze sobą, każdy gada z wieżą.
Automat z napojami – wybierasz numer, automat sam wydaje właściwy produkt.
sprawdzone rozwiązanie typowego problemu projektowego – szkic klas i powiązań
kreacyjne · strukturalne · behawioralne
łatwiejsze tworzenie, modyfikacja i utrzymanie kodu, czytelność
Adapter i Obserwator w Pythonie · zadania praktyczne · mini-projekt.
# adapter.py class StaryTermometr: # nie możemy go zmienić def temperatura_f(self): return 98.6 # stopnie Fahrenheita class AdapterTermometru: def __init__(self, termometr): self.termometr = termometr def temperatura_c(self): # oczekiwany interfejs f = self.termometr.temperatura_f() return round((f - 32) * 5 / 9, 1) czujnik = AdapterTermometru(StaryTermometr()) print(czujnik.temperatura_c()) # 37.0
Program liczy w °C, a stara klasa podaje tylko °F. Nie chcemy jej przerabiać.
Adapter „opakowuje” stary obiekt i udostępnia metodę w oczekiwanym formacie.
# obserwator.py class Kanal: def __init__(self, nazwa): self.nazwa = nazwa self.subskrybenci = [] def subskrybuj(self, widz): self.subskrybenci.append(widz) def opublikuj(self, tytul): for widz in self.subskrybenci: widz.powiadom(self.nazwa, tytul) class Widz: def __init__(self, imie): self.imie = imie def powiadom(self, kanal, tytul): print(f"{self.imie}: nowy film na {kanal} – {tytul}")
# użycie kanal = Kanal("KodujemyPL") kanal.subskrybuj(Widz("Ola")) kanal.subskrybuj(Widz("Kuba")) kanal.opublikuj("Wzorce w Pythonie")
Kanał nie wie, co robi widz – wywołuje tylko powiadom().
def utworz_wroga(poziom): if poziom == "las": return Wilk() elif poziom == "zamek": return Rycerz() return Szczur() wrog = utworz_wroga("zamek")
pizza = (BudowniczyPizzy() .ciasto("cienkie") .sos("pomidorowy") .dodatek("ser") .dodatek("pieczarki") .zbuduj())
lista obserwatorów, metody dodaj_obserwatora() i wpisz_ocene(uczen, przedmiot, ocena)
metoda powiadom() wypisuje: „Rodzic: Jan dostał 5 z matematyki”
powiadamiany tylko o ocenach 1 – wypisuje ostrzeżenie
dodaj obu obserwatorów i wpisz co najmniej 3 oceny
usun_obserwatora()Wybierz jeden wzorzec (kompozyt, budowniczy, mediator) i przygotuj notatkę według schematu:
nazwa · problem · rozwiązanie · konsekwencje
+ krótki przykład w Pythonie (do 20 linii) lub przykład z życia codziennego.
Jak ukryć skomplikowany system za jedną prostą metodą.