State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

Podobné dokumenty
Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Problém, jehož různé instance je třeba často řešit Tyto instance lze vyjádřit větami v jednoduchém jazyce

Generické programování

24. listopadu 2013, Brno Připravil: David Procházka

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Úvod do programovacích jazyků (Java)

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

IRAE 07/08 Přednáška č. 1

1. Dědičnost a polymorfismus

20. Projekt Domácí mediotéka

Kód, který se nebude často měnit

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

typová konverze typová inference

Základy objektové orientace I. Únor 2010

Návrhové vzory OMO, LS 2014/2015

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Observer. Klasifikace. Alias. Smysl. Potřeba sledování změn objektu a notifikace. Obdoba systému událostí (C#, Java) vlastními prostředky

Dědění, polymorfismus

Virtuální metody - polymorfizmus

7.5 Diagram tříd pokročilé techniky

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Programování v C++ 2, 4. cvičení

Abstraktní třídy, polymorfní struktury

specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Konstruktory a destruktory

NMIN201 Objektově orientované programování 1 / :36:09

TÉMATICKÝ OKRUH Softwarové inženýrství

Abstraktní třída a rozhraní

Motivační příklad reálný svět. výroba (assembly line)

PŘETĚŽOVÁNÍ OPERÁTORŮ

Programování II. Polymorfismus

Výčtový typ strana 67

PREPROCESOR POKRAČOVÁNÍ

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

PB161 Základy OOP. Tomáš Brukner

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

návrhový vzor Singleton.

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

9. Polymorfismus a rozhraní

Abstract Factory úvod

Mediator motivace. FontDialog. závislosti mezi jednotlivými ovládacími prvky jsou netriviální

1. Programování proti rozhraní

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

7.5 Diagram tříd pokročilé techniky

NPRG031 Programování II 1 / :25:46

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

, Brno Připravil: David Procházka Návrhové vzory

Programování II. Návrh programu I 2018/19

Programování v C++ 3, 3. cvičení

IoC/DI. Tomáš Herceg Microsoft MVP (ASP.NET)

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Jazyk C# (seminář 3)

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Úvod do programování - Java. Cvičení č.4

Chain of responsibility

Dědičnost (inheritance)

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

Pokud neuvedeme override, vznikne v synu nová (nevirtuální) metoda (a pochopitelně se nezavolá, jak bychom

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Programování v C++ VI

PB161 Programování v jazyce C++ Přednáška 4

Abstraktní datové typy: zásobník

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Návrhové vzory Design Patterns

Objektově orientované programování v PHP 5. Martin Klíma

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Programování II. Modularita 2017/18

PB161 Programování v jazyce C++ Přednáška 9

Programování II. Objektová dekompozice Třída jako objekt 2018/19

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Dědičnost. seskupování tříd do hierarchie. potomek získá všechny vlastnosti a metody. provádí se pomocí dvojtečky za názvem třídy.

Objektové programování

Vyřešené teoretické otázky do OOP ( )

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

Seminář Java II p.1/43

Infrastruktura UML. Modelování struktury v UML. Superstruktura UML. Notace objektů. Diagramy objektů

Programování II. Úvod do dědičnosti 2018/19

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Facade. Známý jako. Účel. Motivace. Facade, Fasáda

TÉMATICKÝ OKRUH Softwarové inženýrství

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Mnohotvarost (polymorfizmus)

Singleton obsah. Motivace Základní myšlenka Implementace Problémy. Dědičnost Obecná implementace Shrnutí. destrukce vícevláknovost

Principy objektově orientovaného programování

Transkript:

State

State Známý jako Stav, Object for States Účel umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu Použitelnost chování objektu závisí na jeho stavu, který se mění za běhu metody vykonávající jednotlivé funkce objektu obsahují větvení v závislosti na nějaké sadě výčtových proměnných

State TCPConnection motivační příklad vnější rozhraní pro klienty abstraktní předek reprezentující stavy chování v konkrétním stavu

State když ho neznám Stav = výčtový typ Stavy rozlišené podmínkou Málo stavů if, else if, else Více stavů switch Více stavově závislých metod Stačí jedna => Copy + Paste Přidání stavu Upravit všechny metody =>

State struktura Struktura Účastníci Context (TCPConnection) definuje rozhraní pro klienty obsahuje instanci podtřídy ConcreteState určuje současný stav State (TCPState) definuje rozhraní objektů reprezentujících jednotlivé stavy Contextu ConcreteStateA, B,... (TCPEstablished, TCPListen, TCPClosed) implementuje konkrétní chování v daném stavu

State použití Použití Context deleguje požadavky na instanci stavu ConcreteState Context definuje rozhraní pro klienty ti mohou inicializovat Context konkrétním stavem Context může předávat referenci na sebe sama při volání metod stavu jednotlivé stavy mohou přistupovat přímo ke kontextu Context mění svůj stav sám, nebo to dělají přímo objekty ConcreteState

State důsledky Chování asociované s konkrétním stavem se nachází v jednom objektu nové stavy se jednoduše přidávají definováním potomka State místo větvení se přechody mezi stavy slučují do samostatných tříd chování není roztroušeno po Contextu může vznikat spousta stavů lišících se v drobnostech Explicitní změna stavu vytváření samostatných objektů pro různé stavy (explicitní) objekty State chrání Context před inkonzistencí interních stavů přechod na jiný stav je atomický (z pohledu Contextu) změna jedné proměnné Sdílení objektů State instance objektů nemají proměnné, stav je reprezentovaný pouze jejich typem v podstatě nemají žádný vlastní stav, jenom chování Flyweight

State implementace Kdo mění stav? Context pevná kritéria ConcreteState Context musí obsahovat interface pro změnu stavu flexibilnější stačí přidat novou třídu a navázat ji na konkrétních místech vznik závislostí jednotlivé stavy o sobě musejí vědět Tabulkou řízený přístup (Vstup, Stav) -> (Funkce, Stav) není třeba měnit kód, ale jen tabulku obvykle pomalejší, obsahuje jen změny stavů bez dalších možností

State implementace (pokračování) Vytváření a rušení instancí stavu vytváření podle potřeby předem neznámé a nepříliš časté změny stavu vytváření předem časté změny stavu větší spotřeba paměti

State konkrétní implementace Context TCPConnection veřejné rozhraní pro klienty protected změna stavu, přátelská třída TCPState class TCPOctetStream; class TCPState; class TCPConnection { public: TCPConnection(); TCPConnection(TCPState*); void ActiveOpen(); void PassiveOpen(); void Close(); void Send(); void Acknowledge(); void Synchronize(); void ProcessOctet(TCPOctetStream*); protected: friend class TCPState; void ChangeState(TCPState*); private: TCPState* _state; }; počáteční stav interface pro změnu stavu instance stavu

State konkrétní implementace (pokračování) TCPConnection TCPConnection::TCPConnection() { _state = TCPClosed::Instance(); } Počáteční stav bezparametrický konstruktor TCPConnection::TCPConnection(TCPState* state) { _state = state; } void TCPConnection::ChangeState (TCPState* state) { _state = state; } void TCPConnection::ActiveOpen() { _state->activeopen(this); } //... Context deleguje konkrétní operace na aktuální instanci stavu

State konkrétní implementace (pokračování) State TCPState abstraktní třída, předek všech stavů interface pro chování TCPState class TCPState { public: virtual void Transmit(TCPConnection*, TCPOctetStream*); jednotlivé operace virtual void ActiveOpen(TCPConnection*); virtual void PassiveOpen(TCPConnection*); virtual void Close(TCPConnection*); virtual void Synchronize(TCPConnection*); virtual void Acknowledge(TCPConnection*); virtual void Send(TCPConnection*); protected: void ChangeState(TCPConnection* t, TCPState* s) { t->changestate(s); }; }; společná metoda pro změnu stavu void TCPState::Transmit (TCPConnection*, TCPOctetStream*) { } void TCPState::ActiveOpen (TCPConnection*) { } void TCPState::Close (TCPConnection*) { } //...

State konkrétní implementace (pokračování) TCPClosed konkrétní stav class TCPClosed : public TCPState { public: static TCPState* Instance(); }; virtual void ActiveOpen(TCPConnection*); virtual void PassiveOpen(TCPConnection*); //... statická metoda Instance stavy implementovány jako Singletony void TCPClosed::ActiveOpen (TCPConnection* t) { // send SYN, receive SYN, ACK, etc. } ChangeState(t, TCPEstablished::Instance()); void TCPClosed::PassiveOpen (TCPConnection* t) { ChangeState(t, TCPListen::Instance()); }

State souhrn, související NV, použití Souhrn Měníme chování objektu v závislosti na vnitřním stavu Související NV Flyweight sdílené stavy bez vlastních vnitřních dat Singleton stavy implementovány jako Singletony Použití návrhového vzoru State grafické editory chování editoru se mění s aktivním nástrojem kreslicí nástroj kreslíme tvary výběrový nástroj vybíráme nakreslené tvary můžeme definovat abstraktní třídu Tool potomci implementují specifické chování při změně nástroje se mění chování editoru