Wiedza ogólna

Skala do drukowania: 80%
Pytania i odpowiedzi

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?

Zagadnienia ogólne

Złożoność obliczeniowa

SQL

Web Security

Paradygmaty programowania i terminologia

Pytania i odpowiedzi rekrutacyjne (PL / ENG)

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 projektowe

Wzorce GoF

Wzorce kreacyjne

Wzorce strukturalne

Wzorce behawioralne

Pytania i odpowiedzi
Interfejs vs klasa abstrakcyjna – jakie są różnice?

Najważniejsze różnice:

Jak powinno wyglądać dobre RESTowe API?

Cechy dobrego RESTowego API:

SOAP vs REST.


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 symetryczne vs asymetryczne?

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ć.

Klasy immutable i mutable – jakie są wady i zalety?

Zalety klas immutable:

Wady klas immutable:

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".

Jakie są popularne statusy kodów HTTP?
Co to jest architektura heksagonalna?

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.

Co to jest SSL?

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.

Co wiesz o bazach NoSQL wymień przykład takiej bazy?

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.

Jakie znasz algorytmy sortowania i jaką mają złożoność obliczeniową?

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)

Czym się różni Stub od Mocka?

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

Co to jest HATEOAS?

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.

Co to jest WSDL?

WSDL (Web Services Description Language) - język do definiowana ounktów dostępu do usłóg sieciowych w XMLu.

Czym są mikroserwisy?

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.

Czym jest Docker?

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.

Co to jest Kubernetes?

Kubernetes - oprogramowanie służące do automatyzacji procesów uruchamiania, skalowania i zarządzania aplikacjami w kontenerach.

Zagadnienia ogólne
Złożoność obliczeniowa

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 n miast oraz odległości pomiędzy każdą parą miast. Zakładając, że komiwojażer zaczyna z miasta A i ma dojść do miasta B jaką trasę powinien pokonać aby była ona najkrótsza?

Przykłady złożoności obliczeniowej (notacja "O"):

SQL (PostgreSQL, Oracle)


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):

Web security

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:

  1. Użytkownik (przez przeglądarkę) wysyła żądanie nawiązania połączenia szyfrowanego.

  2. Serwer w odpowiedzi wysyła klucz publiczny (może to być poprzedzone przesłaniem certyfikatu).

  3. Przeglądarka generuje klucz sesji, który szyfruje kluczem publicznym i przesyła na serwer.

  4. Serwer odszyfrowuje za pomocą klucza prywatnego klucz sesji.

  5. 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.

Paradygmaty programowania i terminologia

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:

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

Pytania i odpowiedzi rekrutacyjne (PL / ENG)
Opowiedz mi o sobie

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.

Dlaczego opuściłeś swoją ostatnią pracę?

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.

Opisz trudną sytuację w pracy i co zrobiłeś, aby ją przezwyciężyć

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.

Opowiedz mi o ostanim projekcie, w którym brałeś udział?

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 projektowe

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

Rodzaje wzorców (i ich przeznaczenie):
Pozostałe wzorce projektowe

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:

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).

Wzorce kreacyjne:

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"
- konfiguracja za pomocą jednej z wielu "rodzin 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

Wzorce strukturalne:

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ść

Wzorce behawioralne:

Ł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