Interfejs vs klasa abstrakcyjna – jakie są różnice?
Jak powinno wyglądać dobre RESTowe API?
SOAP vs REST.
Szyfrowanie symetryczne vs asymetryczne?
Klasy immutable i mutable – jakie są wady i zalety?
Jakie są popularne statusy kodów HTTP?
Co to jest architektura heksagonalna?
Co to jest SSL?
Co wiesz o bazach NoSQL wymień przykład takiej bazy?
Jakie znasz algorytmy sortowania i jaką mają złożoność obliczeniową?
Czym się różni Stub od Mocka?
Co to jest HATEOAS?
Co to jest WSDL?
Czym są mikroserwisy?
Co wiesz o Dockerze?
Co wiesz o Kubernetes?
Złożoność obliczeniowa
SQL
Web Security
Paradygmaty programowania i terminologia
Opowiedz mi o sobie
Dlaczego opuściłeś swoją ostatnią pracę?
Opisz trudną sytuację w pracy i co zrobiłeś, aby ją przezwyciężyć
Opowiedz mi o ostanim projekcie, w którym brałeś udział?
Wzorce GoF
Wzorce kreacyjne
Wzorce strukturalne
Wzorce behawioralne
Najważniejsze różnice:
klasa może rozszerzać tylko jedną klasę abstrakcyjną, ale implementować wiele interfejsów
w klasie abstrakcyjnej nie można deklarować metod domyślnych
w Interfejsie nie można deklarować metod finalnych i konstruktorów
w interfejsie wszystkie pola są finalne (niejawnie) i musimy je zainicjować
w interfejsie wszystkie metody (nie licząc statycznych i domyślnych) są abstrakcyjne (niejawnie)
w Interfejsie nie można deklarować pól prywatnych i chronionych oraz metod chronionych
Cechy dobrego RESTowego API:
dobre nazewnictwo – rzeczowniki w liczbie mnogiej i identyfikatory do pojedynczych elementów kolekcji
rodzaj akcji sterowany medodami HTTP (GET, POST, DELETE, PUT)
nie należy zwracać odpowiedzi jako plain-text (warto używać JSONa)
serwer powinien zwracać odpowiednie kod statusu (1xx – info, 2xx – powodzenie, 3xx – przekierowanie, 4xx – błąd klienta, 5xx – błąd serwera):
operacje na danych (sortowanie, filtrowanie, wyszukiwanie, sronicowanie) powinny odbywać się na istniejących zasobach
wersjonowanie zasobów – znacznik wersji API powinien być umieszczony w nagłówkach żądania (ewentualnie w URLu)
|
SOAP (Simple Object Access Protocol) |
REST (Representational State Transfer) |
Czym jest? |
protokół |
wzorzec architektoniczny |
Format |
XML |
JSON, HTML, XML, tekst |
Bezpieczeństwo |
Wsparcie dla WSS (WebServices-Security) i SSL |
Wsprawcie dla SSL |
Wsparcie dla ACID |
TAK |
NIE |
Cachowanie |
Niemożliwe |
Możliwe |
Protokół |
HTTP, SMTP, UDP |
HTTP |
Szyfrowanie sytetryczne - z użyciem jednego klucza
Szyfrowanie asytetryczne - z użyciem klucza prywatnego i publicznego - kluczem publicznym szyfruje się dane, a prywatnym deszyfruje
Algorytmy symetryczne są szybsze i wymagają mniej mocy obliczeniowej, ale mniej bezpieczne z racji jednego klucza który trzeba udostępniać.
Zalety klas immutable:
bezpieczne wątkowo
niezmienny hashCode - dobre na klucze mapy i elementy zbiorów
możliwość cachowania (np pula Stringów)
Wady klas immutable:
efektem każdej zmiany jest tworzenie nowego obiektu
konieczność inicjalizowania wszystkich właściwości obiektu w konstruktorze
Aby zaimplementować klasę immutable należy oznaczyć wszystkie jej właściwości jako finalne.
Wszystkie obiektowe właściwości będące instancjami niefinalnych klas muszą być tworzone jak również zwracane (getter) przez "klonowanie".
200 OK – po udanym GET
201 Created – po udanym POST
204 No Content – po udanym DELETE
304 Not Modified – zasób do którego odwołuje się żądanie nie został zmodyfikowany – klient posiada go w swoim cache'u
400 Bad Request – nieprawidłowe żądanie
401 Unauthorized – żądanie wymaga uwierzytelnienia (klient musi być zalogowany)
403 Forbidden – użytkownik jest zalogowany, ale nie posiada uprawnień do danego zasobu
404 Not Found – zasób nie istnieje
410 Gone – zasób został trwale usunięty (lub przeniesiony)
500 Internal Server Error – żądanie prawidłowe, ale serwer nie jest w stanie go przetworzyć
Architektura heksagonalna ( ⬡ - "sześciokątna" lub "portów i adapterów") - ilość portów (interfejsów) jest dowolna, a do nich mogą się łączyć adaptery. Dla logiki biznezowej domeny, nie ma znaczenia jaki adapter jest używany. Porty spełniają różne role, a adaptery dostarczają konkretne implementacje. Np.
port "notyfikacje" - adaptery: email, sms.
port "persystencja" - adaptery: baza danych, plik
port "źródła wyzwalające" - adaptery: REST (HTTP), CLI
SSL to protokół do zabezpieczania komunikacji odbywającej się w Internecie. Odbywa się z wykorzystaniem certyfikatu (który zawiera nazwę domeny, okres ważności, dane urzędu certyfikacji, klucz publiczny). Protokół HTTP używający SSLa to HTTPS. Ale można zabezpieczać również komunikację np po SMTP, UDP.
NoSQL - nierelacyjne bazy danych, znajdujące zastosowanie głównie tam gdzie szybkość ma kluczowe znaczenie, np tam gdzie wolumen danych jest ogromny. Minusem natomiast jest brak integralnośći i wsparcia dla ACID. Najpopularniejsze bazy noSQL: MongoDB, Cassandra i Redis.
Name / Time complexity |
Best (Ω - omega) |
Avarege (Θ - theta) |
Worst (O - big "O") |
Worst space complexity |
Quick-sort |
Ω(n log(n)) |
Θ(n log(n)) |
O(n^2) |
O(log(n)) |
Bubble Sort (bąbelkowe) |
Ω(n) |
Θ(n^2) |
O(n^2) |
O(1) |
Heapsort |
Ω(n log(n)) |
Θ(n log(n)) |
O(n log(n)) |
O(1) |
Radix Sort |
Ω(nk) |
Θ(nk) |
O(nk) |
O(n+k) |
Counting Sort |
Ω(n+k) |
Θ(n+k) |
O(n+k) |
O(k) |
Stub - obiekt, zainicjowany w teście, który tworzymy przy użyciu przykładowych danych (bez pisania dodatkowego kodu)
Mock - to klasa, która zastępuje klasę używaną w rzeczywistej implementacji, dostarczając jej okrojoną funkcjonlaność, niezbędną do wykonania testu
HATEOAS (Hypermedia as the Engine of Application State) - API dostarczające informację na temat potencjalnych akcji,
jakie użytkownik może wykonać w danych usługach RESTowych. HATEOAS to czwarty (najwyższy) poziom w modelu dojrzałości Richardson'a.
WSDL (Web Services Description Language) - język do definiowana ounktów dostępu do usłóg sieciowych w XMLu.
Mikroserwisy to względnie niewielkie, niezależne aplikacje. Dzięki tej niezależności ich rozwój i testy są szybsze niż w przypadku monolitu.
Docker to narzędzie do tworzenia, wdrażania i uruchamiania aplikacji przy użyciu kontenerów, które przechowują aplikację wraz z konfiguracją i zależnościami.
Kubernetes - oprogramowanie służące do automatyzacji procesów uruchamiania, skalowania i zarządzania aplikacjami w kontenerach.
Zapis w notacji "duże O" |
Nazwa złożoności |
Przykład |
O(1) |
stała |
Na wejściu programu jest tablica liczb o długości N. Liczby są posortowane rosnąco. Pomiędzy dwoma sąsiadującymi liczbami różnica jest stała. Znajdź sumę liczb w tablicy. |
O(log(n)) |
logarytmiczna |
Na wejściu programu jest posortowana tablica liczb o długości N. Sprawdź czy liczba x istnieje w tablicy wejściowej. |
O(n) |
liniowa |
Na wejściu programu jest tablica liczb o długości N. Znajdź sumę wszystkich liczb w tablicy wejściowej. |
O(n log(n)) |
liniowo-logarytmiczna |
Na wejściu programu jest tablica liczb. Zwróć tablicę, która będzie zawierała te same elementy, które są w tablicy wejściowej. Tablica wynikowa powinna być posortowana w porządku rosnącym. - sortowanie przez scalanie (ang. merge sort) |
O(n2) |
kwadratowa |
JW – sortowanie bąbelkowe (bubble sort) |
O(nx) |
wielomianowa |
Np liniowa lub kwadratowa |
O(xn) |
wykładnicza |
Co najmniej 2n: Na wejściu programu jest tablica unikalnych liczb. Zwróć tablicę, która będzie zawierała wszystkie możliwe podzbiory elementów tablicy wejściowej. |
O(n!) |
(typu) silnia |
Na
wejściu programu jest |
Przykłady złożoności obliczeniowej (notacja "O"):
- dostępu do elementu (mając jego wartość) w tablicy – liniowa
- dostępu do elementu (mając jego wartość) w tablicy posortowanej – logarytmiczna
- dostępu do elementu (mając jego klucz) w tablicy hashowanej – stała (bez kolizji) / liniowa (z kolizjami)
- dostępu do elementu (mając jego wartość) w tablicy hashowanej – liniowa
- złożoność dostępu do elementu w drzewie (np. binary tree) – logarytmiczna
|
Query |
P |
O |
|
SELECT |
SELECT column FROM table |
+ |
+ |
|
INSERT |
INSERT INTO table (column1, column2) VALUES (value1, value2) |
+ |
+ |
|
INSERT SELECT |
INSERT INTO table1 select id, text FROM table2 |
INSERT INTO table1 (column1, column2) select col1, col2 FROM table2 |
+ |
+ |
UPDATE |
UPDATE table SET column1 = value1, column2 = value2 WHERE id = 1 |
+ |
+ |
|
DELETE |
DELETE FROM table1 WHERE id = 1 |
+ |
+ |
|
(INNER) JOIN |
SELECT * FROM table1 t1 JOIN table2 t2 ON t1.column1 = t2.col1 |
+ |
+ |
|
LEFT/RIGHT JOIN |
SELECT * FROM table1 t1 LEFT [OUTER] JOIN table2 t2 ON t1.column1 = t2.col1 |
+ |
+ |
|
FULL JOIN |
SELECT * FROM table1 t1 FULL [OUTER] JOIN table2 t2 ON t1.column1 = t2.col1 |
+ |
+ |
|
LIMIT PostgreSQL |
SELECT * FROM table LIMIT 10 |
+ |
- |
|
LIMIT Oracle |
SELECT * FROM table FETCH FIRST [or NEXT] 10 ROW [or ROWS] ONLY |
- |
+ |
|
OFFSET PostgreSQL |
SELECT * FROM table OFFSET 10 |
+ |
- |
|
OFFSET Oracle |
SELECT * FROM table OFFSET 10 ROW [or ROWS] |
- |
+ |
|
HAVING |
SELECT column1, sum(column2) FROM table GROUP BY column1 HAVING sum(column2) > 20 |
+ |
+ |
|
GROUP BY |
SELECT max(column1), column2 FROM table GROUP BY column2 |
+ |
+ |
|
ORDER BY |
SELECT * FROM table ORDER BY id [ASC | DESC] |
+ |
+ |
|
COUNT |
SELECT count(*) FROM table |
SELECT count(column1) FROM table |
+ |
+ |
MIN/MAX/SUM/AVG |
SELECT min(column1) FROM table |
+ |
+ |
|
UNION |
SELECT id from table1 union select id from table2; |
+ |
+ |
|
CASE |
SELECT a, CASE WHEN a = 1 THEN 'one' WHEN a = 2 THEN 'two' END as slownie FROM table; |
+ |
+ |
|
Indeksy (najczęściej używane):
B-tree – najczęściej używany indeks do stosowania na kolumnach o dużym zróżnicowaniu danych (np nr PESEL)
Złożone – składające się z kilku kolumn (maksymalnie 32)
Unikalne – zakładane na te kolumny, których wartości są unikalne
Zasada działania indeksów – baza danych tworzy nową tabelę gdzie przechowuje wartość indeksowanego pola i wskaźnik do niego
Na czym polega indeksowanie i po co się go używa - przyspiesza wyszukiwanie, opóźnia pozostałe operacje i zwiększają zajętość na dysku
ACID – zbiór właściwości gwarantujących poprawne przetwarzanie transakcji w bazach danych. ACID jest skrótowcem od angielskich słów:
atomicity (niepodzielność) consistency (spójność), isolation (izolacja), durability (trwałość)
Niepodzielność - każda transakcja albo zostanie wykonana w całości, albo w ogóle.
Spójność - po wykonaniu transakcji system będzie spójny, czyli nie zostaną naruszone zasady integralności.
Izolacja - jeśli dwie transakcje wykonują się współbieżnie, to zwykle (w zależności od poziomu izolacji) nie widzą wprowadzanych przez siebie zmian.
Trwałość danych - system potrafi uruchomić się i udostępnić prawidłowe dane np. po nagłej awarii zasilania.
Poziom izolacji - określa, jakich anomalii możemy się spodziewać przy wykonywaniu transakcji. Przykładowe typy izolacji to (model ANSI):
read uncommitted – jedna transakcja może odczytywać wiersze, na których działają inne transakcje (najniższy poziom izolacji)
read committed – transakcja może odczytywać tylko wiersze zapisane
repeatable read – transakcja nie może czytać ani zapisywać na wierszach odczytywanych lub zapisywanych w innej transakcji
serializable (szeregowalne) – współbieżnie i szeregowo realizowane zapytania dają ten sam efekt (pełna izolacja)
SQL Injection – atak wykorzystujący brak filtrowania danych poprzez modyfikację zapytania do bazy danych. Należy filtrować dane.
XSS – osadzenie w treści atakowanej strony (np. komentarz na forum) skryptu, który się wykona w momencie wczytania strony przez użytkowników. Filtrowanie danych – zamiana na encje kodu wyświetlanego w body, lub usuwanie niebezpiecznych znaków, których zamienienie na encje może nie pomóc, jeśli np. mogą wyświetlić się wewnątrz tagu script, w css lub w url'u.
CSRF – atak wykorzystujący uwierzytelnienie użytkownika, który klika w link i nieświadomie wykonuję akcję w danym serwisie jako ten posiadający uprawnienia.
Zabezpieczyć przed takim atakiem można się stosując tokeny CSRF.
Szyfrowanie haseł – klasycznie z użyciem jednostronnych funkcji skrótu (np. SHA-256), oraz soli (np. losowo generowanych ciągów znakowych przechowywanych w bazie) i sekretu (hasła nieznajdującego się w bazie danych – np. zaszytego w kodzie). Aktualnie do generowania hashy i weryfikowania ich zaleca się używanie sprawdzonych funkcji wyprowadzania klucza (np. Argon 2).
HTTPS – szyfrowana wersja protokołu HTTP (protokół przesyłania dokumentów hipertekstowych), działa domyślnie na porcie 443 w protokole TCP.
Działanie HTTPS krok po kroku:
Użytkownik (przez przeglądarkę) wysyła żądanie nawiązania połączenia szyfrowanego.
Serwer w odpowiedzi wysyła klucz publiczny (może to być poprzedzone przesłaniem certyfikatu).
Przeglądarka generuje klucz sesji, który szyfruje kluczem publicznym i przesyła na serwer.
Serwer odszyfrowuje za pomocą klucza prywatnego klucz sesji.
Rozpoczyna się bezpieczne połączenie.
SHA – rodzina jednostonnych funkcji skrótu, do której należa algorytmy SHA-0 (1993), SHA-1 (1995), SHA-2 (2001) czy SHA-3 (2012). W oparciu o powyższe algorytmy działają popularne funkcje skrótów np. w oparciu o algorytm SHA-2 działają funkcje SHA-256 czy SHA-512.
Abstrakcja |
abstract class/method |
- ograniczenie cech obiektu ze świata rzeczywistego do cech kluczowych z punktu widzenia programisty |
Hermetyzacja |
private fields, getters |
- ukrywanie implementacji przed użytkownikiem, któremu udostępnia się interfejs z którego może korzystać |
Dziedziczenie |
extends |
- umożliwia tworzenie bardziej szczegółowych obiektów na podstawie bardziej ogólnych |
Polimorfizm |
instance of |
- łączenie funkcjonalności dziedziczonej i implementowanej samodzielnie |
S |
Zasada jednej odpowiedzialności (Single responsibility principle) |
Klasa powinna mieć tylko jedną odpowiedzialność, czyli dotyczyć tylko jednego zagadnienia. |
O |
Zasada otwarte-zamknięte (Open/closed principle) |
Klasy (encje) powinny być otwarte na rozszerzenia i zamknięte na modyfikacje. Sprowadza się to do świadomego użycia kompozycji, dziedziczenia i modyfikatorów dostępu. |
L |
Zasada podstawienia Liskov (Liskov substitution principle) |
Funkcje które używają referencji do interfejsów lub klas bazowych, muszą być w stanie używać również obiektów implementujących te interfejsy lub klas dziedziczących po klasach bazowych, bez dokładnej ich znajomości. |
I |
Zasada segregacji interfejsów (Interface segregation principle) |
Wiele dedykowanych interfejsów jest lepsze niż jeden ogólny. Nie chcemy zmuszać klas implementujących nasz interfejs do implementacji metod, których nie używa. |
D |
Zasada odwrócenia zależności (Dependency inversion principle) |
Wysokopoziomowe moduły nie powinny zależeć od modułów niskopoziomowych - zależności między nimi powinny wynikać z abstrakcji. |
KISS – Keep It Simple, Stupid – utrzymanie eleganckiej i przejrzystej struktury
DRY – Don't repeat yourself – unikanie wszelkiego rodzaju powtórzeń
YAGNI – You aren't gonna need it – dodawanie jedynie koniecznych funkcjonalności
TDD – Test-Driven Development – najpierw piszemy testy, później implementację, a na końcu refaktoryzujemy kod
DDD – Domain-driven design – definiowanie obiektów i komponentów systemu wiernie odzwierciedlających rzeczywistość. Tworzymy model, z użyciem wzorców projektowych i architektonicznych, a później rozważa się zagadnienia związane z techniczną realizacją.
DDD building block - standardowe role jakie mogą przyjmować obiekty domenowe. Np. Entity (odpowiedzialność biznesowa), Factory (tworzy instancje agregatów)
DAO - Data Access Object – obiekt dostępu do danych, pozwala wydzielić do osobnej warstwy logikę dostępu do bazy danych
DTO - data transfer object - obiekt przenoszący dane, zwykle przy użyciu zdalnych interfejsów (np. usług internetowych), gdzie połączenia są kosztowne.
RDD
- Responsibility Driven Design - należy definiować role jakie mogą
grać w systemie obiekty, a do każdej Roli przypisane są
odpowiedzialności.
CQS
- Command Query Separation - zasada, która mówi że każda metoda w
systemie powinna być zaklasyfikowana do jednej z dwóch grup:
Command - są to metody, które zmieniają stan aplikacji i nic nie zwracają
Query - są to metody, które coś zwracają, ale nie zmieniają stanu aplikacji
CQRS - Command Query Responsibility Segregation - CQS dla klas, a nie dla metod.
GRASP - General Responsibility Assignment Software Patterns - Wzorce oprogramowania, w oparciu o które przypisujemy odpowiedzialność. Np Creator, Controller.
FIRST - myślenie pierwszymi zasadami - dzielenie problemu na małe elementy i opieranie się wyłącznie na bezsprzecznych faktach
jakość wytwarzanego oprogramowania | praca w zespole | lubię pomagać | dron, spacery
W pracy ważne jest dla mnie pisanie oprogramowania zgodnie ze standardami. Cenie pracę w zespole. To łączenie przyjemnego z pożytecznym. Lubię pomagać. To mi daje satysfakcję.
Kupiłem drona rok temu. Bardzo lubię latać. Latam nawet na symulatorze na komputerze. Lubię spacerować. |
At work, it is important for me to write software in accordance with standards. I value teamwork. It is a combination of pleasant and useful. I like to help others.
I bought a drone a year ago. I really like flying. I also fly on a computer simulator. I like walking. |
stare technologie | brak możliwości rozwoju
W Sygnity w ostatnim roku pracowałem w starych technologiach. Był plan przejścia na Springa, jednak nie został zrealizowany, więc nie mogłem się rozwijać. |
In Sygnity, I worked in old technologies last year. There was a plan to switch to Spring, but it was not implemented, so I could not develop. |
podróż do Warszawy podczas której naprawiałem buga, abyśmy mogli zaprezentować stworzoną funkcjonalność
Mieliśmy delegację. Jechaliśmy do Warszawy aby zaprezentować naszemu klientowi pewną funkcjonalność. Dzień wcześniej został w niej wykryty poważny błąd. W pociągu wyciągnąłem laptopa i naprawiłem ten błąd, dzięki czemu prezentacja się udała. |
We had a delegation. We were traveling to Warsaw to present our client some functionality. The day before, a serious bug was detected in it. On the train I took out my laptop and fix this bug, so the presentation was successful. |
serwis dla ludzi potrzebujących | ludzie mogą znaleść najbliższa placówkę lub telefon | technologie: Java 11, EJB 3, WildFly, PostgreSQL
Ostatni projekt, w którym brałem udział to RJPS. To znaczy Rejestr Jednostek Pomocy Społecznej. Jest to serwis dla ludzi potrzebujących, jak bezdomni, alkoholicy czy ofiary przemocy. Na tej stronie, ludzie mogą znaleść najbliższą placówkę, w której mogą uzyskać pomoc, albo mogą się dowiedzieć, gdzie zadzwonić aby porozmawiać o swoim problemie. Projekt był realizowany w technologiach takich jak: Java 11, Enterprise Java Bean 3, serwer WildFly, baza PostgreSQL. |
The last project I worked on was RJPS. That is Rejestr Jednostek Pomocy Społecznej. It is a service for people with problems, for example homeless people, alcoholics or victims of violence. On this site, people can find the nearest place where they can get help, or they can find out where to call to talk about their problem. The project was implemented in technologies such as: Java 11, Enterprise Java Bean 3, WildFly server, PostgreSQL database. |
Wzorce GoF (Gang of Four) http://geekswithblogs.net/subodhnpushpak/archive/2009/09/18/the-23-gang-of-four-design-patterns-.-revisited.aspx
Kreacyjne (konstrukcyjne) / Creational Patterns |
Strukturalne / Structural Patterns |
Behawioralne (czynnościowe) / Behavioral Patterns |
Fabryka abstrakcyjna / Abstract Factory |
Adapter |
Łańcuch odpowiedzialności / Chain of Responsibility |
Budowniczy / Builder |
Most / Bridge |
Polecenie / Command |
Metoda wytwórcza / Factory (Method) |
Kompozyt / Composite |
Interpreter |
Prototyp / Prototype |
Dekorator / Decorator |
Iterator |
Singleton |
Fasada / Facade |
Mediator |
|
Pyłek / Flyweight |
Pamiątka / Memento |
|
Pełnomocnik / Proxy |
Obserwator / Observer |
|
|
Stan / State |
|
|
Strategia / Strategy |
|
|
Metoda szablonowa / Template |
|
|
Odwiedzający / Visitor |
kreacyjne (konstrukcyjne) – opisują proces tworzenia, inicjalizacji oraz konfiguracji obiektów
strukturalne – opisują struktury powiązanych ze sobą obiektów
behawioralne (czynnościowe) – opisują zachowanie i odpowiedzialność współpracujących ze sobą obiektów
DAO (Data Access Object) - obiekt dostępu do danych. Pozwala wydzielić logikę dostępu do DB do osobnej warstwy. W ramach DAO dla tabeli tworzymy:
model
interfejs (metoda get(id), getAll(), itd...)
implementacja zarządzająca wpisami w bazie implementująca interfejs
MVC (Model View Controller) - wzorzec (architektoniczny) służący do podziału struktury aplikacji na 3 warstwy.
Dependency Injection – wstrzykiwanie zależnośći.
Zależności między komponentami są czysto abstrakcyjne. Oznacza się jedynie jakiego typu parametru oczekujemy (w konstruktorze czy setterze), a kontener IoC sam wstrzykuje te zależności. W konstruktorze najlepiej wstrzykiwać obowiązkowe zależności, a w setterach opcjonalne. Wstrzykiwanie zależnośći jest popularną realizacją paradygmatu IoC (odwrócenia sterowania).
Fabryka abstrakcyjna
Tworzy "powiązane" ze sobą obiekty, gdzie zarówno fabryka jak i produkty posiadają klasy abstrakcyjne i konkretne.
-
niezależność systemu od tworzenia "produktów" |
|
Budowniczy
Tworzenie obiektu klasy tylko przez konstruktor podklasy. Użycie jak w streamach!
- tworzenie obiektu jest niezależne od składników i sposobu ich łączenia - proces konstrukcji musi umożliwiać tworzenie różnych reprezentacji |
|
Metoda wytwórcza
Klasa "factory" (if-else'ami) zwraca konkretną implementację (Square, Circle) typu ogólnego (Shape), na podstawie przekazanego argumentu.
- w momencie definiowania obiektu nie można z góry ustalić konkretnego typu |
|
Singleton (wzorzec kreacyjny)
Klasa będzie miałą tylko jedną instancję, do której zapewnia globalny dostęp.
- potrzeba istnienia dokładnie jednego egzemplarza danej klasy |
|
Adapter Dostosowuje interfejs
niekompatybilnej klasy do używanego w aplikacji interfejsu. - potrzeba wykorzystania (np. skomplikowanej) klasy, ale niezgodnej z używanym interfejsem |
|
Kompozyt Składa obiekty proste i
złożone w struktury drzewiaste. - potrzeba traktowania obiektów prostych i złożonych w ten sam sposób - potrzeba przedstawienia obiektów w hierarchi drzewiastej |
|
Dekorator Klasy dekorujące rozszerzają
dekorator i implementują ten sam interfejs, który implementuje
model bazowy - potrzeba dodawać zadania do obiektu w "dynamiczny" i przejrzysty sposób |
|
Fasada Udostępnienie jednolitego
interfejsu zbioru interfejsów - chęć udostępnienia uproszczonego pojedynczego interfejsu - ułatwienie przenoszenia systemu za fasadą między platformami |
|
Pełnomocnik Implementuje ten sam interfejs
co obiekt docelowy. Nie wczytuje obiektu docelowego w momencie
jego inicjalizacji. - reprezentant zasobu lokalnego lub zdalnego - pośrednik zabezpieczający lub otwierający na wyłączność |
|
Łańcuch odpowiedzialności
Każdy obiekt z łańcucha przechowuje referencje do kolejnego obiektu. Jeśli pierwszy element nie obsłuży żądania przekazuje je dalej.
- kiedy więcej niż jeden obiekt, może obsłużyć żądanie (a nie wiadomo z góry który) |
|
Iterator
Zapewnia sekwencyjny dostęp do elementów obiektu złożonego.
- potrzeba uzyskania dostępu do zawartości bez ujawniania prezentacji |
|
Obserwator
Określa zależność jeden do wielu między obiektami. Kiedy zmieni się stan obiektu, wszystkie obserwatory są o tym powiadamiane (w pętli foreach).
- jeśli zmiana w jednym obiekcie wymaga zmodyfikowania innych (obserwatorów) |
|
Stan
Obiekty stanu wywołując metodę (z param. np. context) zmieniają stan kontekstu. Obiekty stanu wywołują metodę (np. doAction), przyjmującą kontekst jako parametr na którym wywołują jakąś metodę (np. setState(this)).
- obiekt musi zmieniać działanie zależnie od stanu w czasie wykonywania programu |
|
Strategia
Określa grupę algorytmów, kapsułkuje je i umożliwia ich zamienne stosowanie. Obiekt strategii jest przypisywany do właściwości obiektu kontekstu. Wołamy metodę kontekstu (np. executeStrategy), która na obiekcie strategii woła inną metodę.
- potrzeba różnych zachowań obiektu w zależności od przyjętej strategii |
|
Metoda szablonowa
Określa szkielet algorytmu i pozwala na doprecyzowanie niektórych jego kroków. Finalna metoda (np. play) zawiera niefinalne (nadpisywalne) kroki (metody).
- potrzeba implementacji wspólnego algorytmu, w ramach którego poszczególnych elementów istnieją różnice, które implementujemy w osobnych klasach |
|