Wzorce czynnościowe - Interpreter, Iterator, Odwiedzający, Pamiątka, Polecenie Flashcards

1
Q

Wzorce czynnościowe - druga połowa

A
  • interpreter
  • iterator
  • odwiedzający
  • pamiątka
  • polecenie
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Interpreter - nazwa

A

ang. interpreter

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Interpreter - typ

A

klasowy, czynnościowy

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Interpreter - Przeznaczenie

A

Zadaniem wzorca jest interpretacja poleceń innego języka. Użycie tego wzorca polega na zdefiniowaniu opisu gramatyki sformalizowanego języka interpretowanego i stworzenie dla niego interpretera, dzięki któremu będzie możliwe rozwiązanie danego problemu. Wzorzec ten implementuje swojego rodzaju parser, który konwertuje jedną reprezentację danych w inną

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Interpreter - Uzasadnienie

A

Złożone często występujące problemy, można zapisać za pomocą prostego języka, a następnie zbudować interpreter rozwiązujący problem za jego pomocą. Odpowiednim regułom służą klasy

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Interpreter - Warunki stosowania

A

Jeśli istnieje interpretowany język, a zdania z tego języka można przedstawić za pomocą drzewa składni abstrakcyjnej.
• prosta gramatyka (przy skomplikowanej, hierarchia klas staje się trudna w zarządzaniu)
• wydajność nie jest najważniejsza (wydajne tłumaczą na inną postać, np. wyr. regularne przekształcane są w maszyny stanowe)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Interpreter – Elementy

A

• AbstractExpression
- obejmuje deklarację operacji Interpret wspólnej wszystkim węzłom
• TerminalExpression
- implementacja operacji Interpret, dla każdego symbolu końcowego należy utworzyć egzemplarz tej klasy
• NonterminalExpression
- dla każdej reguły w gramatyce trzeba utworzyć egzemplarz tej klasy, przechowuje zmienne egzemplarza typu AbstractExpression
• Context
- przechowuje informacje globalne interpretera
• Client
- tworzy drzewo składni abstrakcyjnej reprezentujące określone zadanie w języku zdefiniowanym przez gramatykę, wywołuje operację Interpret

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Interpreter – Współdziałanie elementów

A
  • Klient tworzy (lub otrzymuje) zdanie jako drzewo składni abstrakcyjnej obejmujące egzemplarze klas NonterminalExpression i TerminalExpression. Następnie klient inicjuje kontekst i wywołuje operację Interpret.
  • Każdy węzeł klasy NonterminalExpression definiuje operację Interpret w kategoriach operacji Interpret poszczególnych podwyrażeń. Operacja Interpret w każdej klasie TerminalExpression określa przypadek bazowy w rekurencji.
  • Operacje Interpret w każdym węźle wykorzystują kontekst do zapisywania i pobierania stanu interpretera
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Interpreter – Konsekwencje

A
    • modyfikowanie i rozszerzanie gramatyki jest łatwe
    • implementowanie gramatyki także jest łatwe
    • zarządzanie złożonymi gramatykami jest trudne
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Interpreter – Implementacja

A
  • Wzorzec interpreter nie określa jak tworzyć drzewa składni abstrakcyjnej.
  • Można użyć wzorca pyłek do współużytkownika symboli końcowych.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Interpreter – Powiązane wzorce

A
  • Kompozyt - drzewo składni abstrakcyjnej to przykład zastosowania tego wzorca
  • Pyłek - współużytkowanie symboli końcowych
  • Iterator - można użyć do przechodzenia po strukturze
  • Odwiedzający - do umieszczenia w jednej klasie zachowania każdego z węzłów kl. abstrakcyjnej
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Interpreter - przykład

A

Sposób zapisu wyrażeń arytmetycznych, w którym znak wykonywanej operacji umieszczony jest po operandach (zapis postfiksowy), a nie pomiędzy nimi jak w konwencjonalnym zapisie algebraicznym (zapis infiksowy).

Konwencjonalny zapis (2+3)*5 => ONP zapis 2 3 + 5

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Iterator - nazwa

A

ang. iterator

pol. kursor
ang. cursor

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Iterator - typ

A

obiektowy, czynnościowy

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Iterator - Przeznaczenie

A

Czynnościowy wzorzec projektowy, którego zadaniem jest zapewnienie sekwencyjnego dostępu do elementów zbioru bez ujawnienia jego implementacji wewnętrznej.

Pod pojęciem zbioru kryją się bardzo różne struktury danych, takie jak listy, kolejki, stosy, zbiory, mapy, tabele, itp.

Wzorzec ten ma na celu udostępnienie zunifikowanego interfejsu dostępowego do elementów tych struktur danych.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Iterator - Uzasadnienie

A
  • Obiekty zagregowane powinny umożliwiać dostęp do swoich elementów bez ujawniania wewnętrznej struktury.
  • Można poruszać się po liście na różne sposoby, jednak bez rozbudowywania interfejsu klasy list.
  • Możliwość uruchomienia kilku procesów poruszających się po liście w jednym czasie.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Iterator - Warunki stosowania

A
  • W celu uzyskania dostępu do zawartości obiektu zagregowanego bez ujawniania jego wewnętrznej reprezentacji.
  • Aby umożliwić jednoczesne działanie wielu procesom przechodzenie po obiektach zagregowanych.
  • Udostępnienie jednolitego interfejsu do poruszania się po różnych zagregowanych strukturach (czyli zapewnienie obsługi iteracji polimorficznej).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Iterator - Elementy i współdziałanie

A

• Iterator:
- definiuje interfejs umożliwiający dostęp do elementów i przechodzenie po nich.
• Concretelterator:
- obejmuje implementację interfejsu klasy Iterator;
- śledzi bieżącą pozycję w czasie przechodzenia po agregacie.
• Aggregate:
- definiuje interfejs do tworzenia obiektów Iterator.
• ConcreteAggregate:
- obejmuje implementację interfejsu do tworzenia obiektów Iterator zwracającą egzemplarz odpowiedniej klasy Concretelterator.

Obiekt Concretelterator śledzi bieżący obiekt w agregacie i potrafi ustalić następny obiekt, do którego należy przejść.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Iterator - Konsekwencje

A
  • Umożliwienie zmiany sposobu przechodzenia po elemencie złożonym (agregacie) - zmiana algorytmu w trakcie przechodzenia.
  • Uproszczenie interfejsu klasy Aggregate.
  • Możliwość jednoczesnego działania więcej niż jednego procesu przechodzenia po elemencie złożonym.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Iterator - Implementacja

A

• Który element ma sterować iterowaniem?
- Iterator zewnętrzny (aktywny) - iterator steruje
- Iterator wewnętrzny (pasywny) - klient steruje
• Gdzie zdefiniowany jest algorytm przechodzenia (agregat albo iterator)
• Czy jest niezawodny (modyfikacja agregtu)
• Minimalizacja interfejsu iteratora (First, Next, IsDone, CurrentItem > First, Item)

21
Q

Iterator - Powiązane wzorce

A
  • Kompozyt - iteratory często stosuje się do struktur rekurencyjnych takich jak kompozyt.
  • Metoda wytwórcza - iteratory polimorficzne korzystają z metod wytwórczych do generowania egzemplarzy odpowiednich podklas klasy Iterator.
  • Pamiątka - iterator może korzystać z pamiątki do zapisywania stanu iteracji i wewnętrznie przechowuje pamiątkę.
22
Q

Odwiedzający - nazwa

A

ang. visitor

23
Q

Odwiedzający - typ

A

obiektowy, czynnościowy

24
Q

Odwiedzający - Przeznaczenie

A

Wzorzec projektowy, dzięki któremu mamy możliwość oddzielenia kodu implementującego algorytmy od obiektów, w których te algorytmy mają pracować.

Dzięki temu można w łatwy sposób dodać nowe rodzaje operacji na obiektach, nie dokonując większych zmian na tych obiektach, a jedynie dopisując nowe algorytmy w zewnętrznych klasach.

25
Q

Odwiedzający - Uzasadnienie

A

• Wprowadzony zostaje nowy typ obiektu Wizytator, którego zadaniem jest odwiedzenie każdego elementu w danej strukturze obiektów i wykonanie na nim konkretnych działań. Różne implementacje wizytatorów mogą wykonywać różne zadania, rozszerzając funkcjonalność struktury elementów bez ich wewnętrznej modyfikacji.

26
Q

Odwiedzający - Warunki stosowania

A
  • Jeśli struktura obiektów obejmuje wiele klas o różnych interfejsach, a chcesz wykonywać na tych obiektach operacje zależne od ich klas konkretnych.
  • Kiedy na obiektach z ich struktury trzeba wykonywać wiele różnych i niepowiązanych operacji, a chcesz uniknąć „zaśmiecania” klas tymi operacjami. Wzorzec Odwiedzający umożliwia przechowywanie powiązanych operacji razem przez zdefiniowanie ich w jednej klasie.
  • Gdy klasy definiujące strukturę obiektów rzadko się zmieniają, ale często chcesz definiować nowe operacje dla tej struktury.
27
Q

Odwiedzający - Elementy i współdziałanie

A

• Visitor, czyli odwiedzający:
- obejmuje deklarację operacji Visit dla każdej klasy ConcreteElement ze struktury obiektów.
- Nazwa i sygnatura operacji określają klasę wysyłającą do odwiedzającego żądanie Visit. Umożliwia to odwiedzającym ustalenie klas konkretnego odwiedzanego elementu. Następnie odwiedzający może bezpośrednio uzyskać dostęp do elementu poprzez jego interfejs.
• ConcreteVisitor, czyli odwiedzający konkretny:
- obejmuje implementację wszystkich operacji zadeklarowanych w klasie Visitor. Każda operacja realizuje fragment algorytmu zdefiniowanego na potrzeby odpowiedniej klasy obiektu ze struktury. Klasa ConcreteVisitor udostępnia kontekst działania algorytmu i przechowuje jego lokalny stan. W stanie często akumulowane są wyniki w czasie przechodzenia po danej strukturze.
• Element
- definiuje operację Accept przyjmującą odwiedzającego jako argument.
• ConcreteElement
- obejmuje implementację operacji Accept przyjmującej odwiedzającego jako argument.
• ObjectStructure
- może wyliczać zapisane w niej elementy;
- może udostępniać wysokopoziomowy interfejs, który umożliwia odwiedzającym odwiedzenie elementów struktury;
- może być albo kompozytem, albo kolekcją, taką jak lista lub zbiór.

28
Q

Odwiedzający - Konsekwencje

A
    • Ułatwia dodawanie nowych operacji. Wzorzec ten sprawia, że można łatwo dodawać operacje zależne od komponentów złożonych obiektów.
    • Umożliwia połączenia powiązanych operacji i wyodrębnienia niepowiązanych. Powiązane zachowania nie są w omawianym wzorcu umieszczane w klasach definiujących strukturę obiektów. Zamiast tego znajdują się w odwiedzającym.
    • Utrudnia dodawanie nowych klas ConcreteElement.
    • Umożliwia odwiedzanie różnych hierarchii klas. Iterator pozwala odwiedzać obiekty w strukturze w czasie przechodzenia po nich przez wywoływanie ich operacji. Jednak iterator nie może działać dla różnych struktur obiektów z elementami innego typu.
29
Q

Odwiedzający - Implementacja

A
  • Dla każdej struktury obiektów należy utworzyć klasę Visitor.
  • W tej klasie abstrakcyjnej zadeklarowane są operacje VisitConcreteElement dla wszystkich Klas ConcreteElement definiujących strukturę obiektów.
  • Każda operacja Visit w klasie Visitor ma argument określonego typu ConcreteElement, co umożliwia klasie Visitor bezpośredni dostęp do interfejsu danego typu.
  • W klasach ConcreteVisitor każda operacja Visit jest przesłonięta i obejmuje implementacją specyficznego dla odwiedzającego zachowania dla odpowiedniej klasy ConcreteElement.
30
Q

Odwiedzający - Powiązane wzorce

A
  • Kompozyt - odwiedzających można wykorzystać do zastosowania operacji dla struktury obiektów zdefiniowanej za pomocą wzorca Kompozyt.
  • Interpreter - odwiedzającego można zastosować do przeprowadzenia interpretacji.
31
Q

Pamiątka - nazwa

A

ang. memento

pol. znacznik
ang. token

32
Q

Pamiątka - typ

A

obiektowy, czynnościowy

33
Q

Pamiątka - Przeznaczenie

A

Bez naruszania kapsułkowania rejestruje i zapisuje w zewnętrznej jednostce wewnętrzny stan obiektu, co umożliwia późniejsze przywrócenie obiektu według zapamiętanego stanu.

34
Q

Pamiątka - Uzasadnienie

A

Czasem trzeba zarejestrować stan obiektu. Jest to niezbędne przy implementowaniu punktów kontrolnych i mechanizmów cofania umożliwiających użytkownikom anulowanie operacji wykonanych na próbę lub przywrócenie stanu programu po wystąpieniu błędów.

Obsługa cofania działań w tej aplikacji nie jest tak prosta, jak się to może wydawać. Oczywisty sposób na anulowanie operacji polega na zapisaniu odległości, o którą przesunięto obiekt, i przeniesieniu go z powrotem o tę samą odległość. Jednak nie gwarantuje to, że wszystkie obiekty pojawią się w wyjściowych miejscach.

35
Q

Pamiątka - Warunki stosowania

A
  • kiedy trzeba zachować obraz (części) stanu obiektu w celu jego późniejszego odtworzenia w tym stanie
  • kiedy bezpośredni interfejs do pobierania stanu spowodowałby ujawnienie szczegółów implementacji i naruszenie kapsułkowania obiektu.
36
Q

Pamiątka - Elementy i współdziałanie

A

• Memento, czyli pamiątka:
- przechowuje wewnętrzny stan obiektu źródła.
- chroni dane przed dostępem przez obiekty inne niż źródło. Pamiątki mają w istocie dwa interfejsy. Zarządca widzi zawężony interfejs pamiątki i może jedynie przekazywać ją innym obiektom, natomiast źródło ma dostęp do pełnego interfejsu, umożliwiającego dostęp do wszystkich danych potrzebnych do przywrócenia swojego wcześniejszego stanu. W idealnych warunkach dostęp do wewnętrznego stanu pamiątki ma tylko źródło, które ją utworzyło.
• Originator, czyli źródło:
- tworzy pamiątkę obejmującą zapis wewnętrznego stanu źródła;
- korzysta z pamiątki do przywrócenia swojego wewnętrznego stanu.
• Caretaker (mechanizm cofania), czyli zarządca:
- odpowiada za zarządzanie pamiątką;
- nigdy nie manipuluje zawartością pamiątki ani jej nie sprawdza.

Zarządca żąda od źródła udostępnienia pamiątki, przechowuje ją przez określony czas i przekazuje z powrotem do źródła.

37
Q

Pamiątka - Konsekwencje

A

+ Zachowanie granic kapsułkowania. Pamiątka pozwala uniknąć udostępniania informacji, które trzeba zapisać poza źródłem, choć tylko ono powinno nimi zarządzać.
• - Korzystanie z pamiątek może być kosztowne. Pamiątki mogą powodować znaczące koszty, jeśli obiekty Originator muszą kopiować duże ilości informacji, które trzeba zapisać w pamiątce
• - Definiowanie zawężonego i pełnego interfejsu. W niektórych językach zagwarantowanie, że tylko źródło ma dostęp do stanu pamiątki, może okazać się trudne.
• - Ukryte koszty zarządzania pamiątkami. Zarządca odpowiada za usuwanie powiązanych z nim pamiątek. Nie wie jednak, jak rozbudowany jest stan zapisany w pamiątkach.

38
Q

Pamiątka - Implementacja

A
  • Pomocne mechanizmy w języku. Pamiątki mają dwa interfejsy — pełny dla źródeł i zawężony dla pozostałych obiektów. W idealnych warunkach język użyty do implementacji powinien zapewniać dwa poziomy statycznej ochrony
  • Zapisywanie przyrostowych zmian. Kiedy pamiątki są tworzone i przekazywane z powrotem do źródła w przewidywalnej kolejności, wtedy w klasie Memento wystarczy zapisać przyrostowe zmiany w wewnętrznym stanie źródła.
39
Q

Pamiątka - Powiązane wzorce

A
  • Polecenie - polecenia mogą korzystać z pamiątek do zachowywania stanu na potrzeby operacji umożliwiających cofanie.
  • Iterator - pamiątki można wykorzystać do iterowania w opisany wcześniej sposób.
40
Q

Polecenie - nazwa

A

ang. command

pol. akcja
ang. action

pol. transakcja
ang. transaction

41
Q

Polecenie - typ

A

obiektowy, czynnościowy

42
Q

Polecenie - Przeznaczenie

A

Czynnościowy wzorzec projektowy, przy pomocy którego żądanie wykonania czynności traktowane jest jako obiekt, nazywany poleceniem.

Obiekty takie rozszerzają wspólny interfejs, przy pomocy którego wykonują lub cofają dane polecenie. Zaletą stosowania tego wzorca jest zapewnienie większej elastyczności oraz możliwości rozszerzania aplikacji o nowe polecenia. Wadą natomiast jest konieczność tworzenia większej ilości obiektów.

43
Q

Polecenie - Uzasadnienie

A

Za pomocą obiektów Command można łatwo zaimplementować menu. W klasie Menu każda opcja to egzemplarz klasy Menultem. Klasa Application tworzy menu i opcje, a także pozostałe części interfejsu użytkownika. Ponadto klasa Application śledzi obiekty Document otworzone przez użytkownika.

44
Q

Polecenie - Warunki stosowania

A
  • Do parametryzowania obiektów za pomocą wykonywanych działań (tak jak obiektów Menultem we wcześniejszym przykładzie).
  • Do określania, kolejkowania i wywoływania żądania w różnych miejscach programu.
  • Do umożliwiania cofania zmian. Operacja Execute obiektu Command może w samym poleceniu przechowywać stan potrzebny do anulowania efektów jej działania.
  • Do obsługi rejestrowania zmian, aby można je ponownie przeprowadzić w przypadku awarii systemu.
45
Q

Polecenie - Elementy i współdziałani

A
  • Command: - obejmuje deklarację interfejsu przeznaczonego do wykonywania operacji.
  • ConcreteCommand: - definiuje powiązanie między obiektem Receiver i działaniem; - obejmuje implementację operacji Execute w postaci wywołania odpowiednich operacji obiektu Receiver.
  • Client: - tworzy obiekt ConcreteCommand i określa powiązanego z nim odbiorcę.
  • Invoker: - żąda obsłużenia żądania od polecenia.
  • Receiver: - potrafi wykonać operacje potrzebne do obsłużenia żądania. Funkcję odbiorcy może pełnić dowolna klasa.

Klient tworzy obiekt ConcreteCommand i określa powiązanego z nim odbiorcę. Obiekt Invoker przechowuje obiekt ConcreteCommand. Obiekt Invoker zgłasza żądanie przez wywołanie operacji Execute obiektu polecenia. Jeśli polecenia można cofać, obiekt ConcreteCommand przed wykonaniem tej operacji zapisuje stan na potrzeby anulowania zmian. Obiekt ConcreteCommand wywołuje operacje odbiorcy, aby obsłużyć żądanie.

46
Q

Polecenie - Konsekwencje

A
    • Obiekt Command oddziela obiekt wywołujący operację od tego, który potrafi ją wykonać.
    • Polecenia to standardowe obiekty. Można nimi manipulować i rozszerzać je w taki sam sposób jak inne obiekty.
    • Polecenia można połączyć w polecenie złożone. Polecenia złożone są zwykle tworzone zgodnie z wzorcem Kompozyt
    • Dodawanie nowych obiektów Command jest proste, ponieważ nie wymaga modyfikowania istniejących klas.
47
Q

Polecenie - Implementacja

A
  • Jak „inteligentne” powinno być polecenie? Polecenia mogą mieć bardzo zróżnicowane możliwości. Z jednej strony mogą jedynie definiować powiązanie między odbiorcą i działaniami potrzebnymi do obsłużenia żądania. Z drugiej strony mogą obejmować implementację wszystkich operacji i nie delegować żadnych zadań do odbiorcy
  • Obsługiwanie cofania i powtarzania operacji. Polecenia mogą obsługiwać cofanie i powtarzanie operacji, jeśli udostępniają sposób na anulowanie skutków ich działania może to wymagać przechowywania dodatkowych informacji o stanie.
48
Q

Polecenie - Powiązane wzorce

A
  • Do zaimplementowania poleceń złożonych można wykorzystać wzorzec Kompozyt.
  • Wzorzec Pamiątka umożliwia zachowanie stanu potrzebnego poleceniu do cofnięcia efektów jego wykonania.
  • Polecenie, które trzeba skopiować przed umieszczeniem w historii, działa jak Prototyp.