Memento. Motivace – kalkulačka 210° sin * /20 ? 0.25 ^2 ?

Slides:



Advertisements
Podobné prezentace
Memento. Obnovení operačního systému ( Windows | Linux...) Všichni víme, co jsou transekce v databázi Memento – zálohování databáze.
Advertisements

IBM Global Technology Services © 2006 IBM Corporation Zabezpečení přístupu k informacím na základě elektronického podpisu Konference eČesko 2006.
Projekt Informační a vzdělávací portál Libereckého kraje I CZ.1.07/1.1.00/ I Školení pro uživatele portálu.
Inf Tabulkový procesor - funkce. Výukový materiál Číslo projektu: CZ.1.07/1.5.00/ Šablona: III/2 Inovace a zkvalitnění výuky prostřednictvím ICT.
Programování v jazyce C++ Dědičnost a polymorfismus.
Název školyZákladní škola praktická Rožnov pod Radhoštěm Číslo projektuCZ / / Číslo materiáluVY_32_INOVACE_225 AutorMgr. Romana Rybiařová.
Obchodní akademie, Střední odborná škola a Jazyková škola s právem státní jazykové zkoušky, Hradec Králové Autor:Mgr. Bc. Klára Loudová Název materiálu:
Autor: Předmět: Ročník: Název: Označení: DUM vytvořen: Mgr. Hana Němcová Matematika, seminář diferenciální a integrální počet Osmý ročník víceletého gymnázia.
Tabulkový procesor Odebrání skrytých dat a osobních informací kontrolou sešitů Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Růžena Hynková.
Principy Základních registrů Ing. Ondřej Felix, CSc.
PJV15 1 Vnořené ( nested ) a vnitřní ( inner ) členy Třídy či interfejsy mohou být členy tříd či interfejsů. Je-li X obalem Y a Y obalem Z, pak Z získá.
Řetězce v jazyce C ● řetězec je posloupnost znaků ● řetězcové konstanty se v C vkládají mezi uvozovky, např. "Ahoj Hugo!" ● v paměti je řetězec uložen.
Projekt: Škola pro život Registrační číslo: CZ.1.07/1.4.00/ Číslo DUM: VY_32_INOVACE_02-informatika 8. třída_021 Základní škola: Základní škola.
Energetická hodnota potravin (EH)
Dopravní modely v SUMP Jitka Ondráčková
16.1 Dokument v digitální podobě
Název školy: ZŠ Klášterec nad Ohří, Krátká 676 Autor: Mgr
Jak se UČIT K MATURITĚ? Motivace, koncentrace, paměť.
Systémové databáze v SQL Serveru
Ucelené řešení pro řízení lidských zdrojů, ekonomiky a logistiky
Role Úřadu Regionální rady
Software počítače – opakování
Grafické programy - opakování
Biologie - pokyny ke zkoušce
Evaluace předmětů studenty (Anketky)
Číslo projektu CZ.1.07/1.5.00/ Číslo materiálu
Programování v jazyce C++
Prezentace projektu z předmětu PGRF2
Financováno z ESF a státního rozpočtu ČR.
Základní škola a Mateřská škola Bílá Třemešná, okres Trutnov
Software počítače 1 - opakování
TÉMA: Počítačové systémy
Databáze MS ACCESS 2010.
Nakládání s odpady CZ.1.07/1.5.00/ VY_32_INOVACE_MA_ZP_03
Hra ke zopakování či procvičení učiva nebo test k ověření znalostí
Abstract Factory.
Poměr v základním tvaru.
NÁZEV ŠKOLY: ZŠ KOLÍN V.,MNICHOVICKÁ 62
NÁZEV ŠKOLY: Základní škola a praktická škola Arkadie o. p. s.
Popis výukového materiálu Název: PowerPoint
Hra ke zopakování či procvičení učiva:
Informatika pro ekonomy přednáška 8
NÁZEV ŠKOLY: Základní škola Josefa Bublíka, Bánov
Corel PHOTO-PAINT Úloha 1 Zpracovala: Mgr. Jitka Hotařová
Opakování učiva pro 9. ročník
Materiál byl vytvořen v rámci projektu
Builder „Návrhový vzor oddělující konstrukci složitých objektů od jejich reprezentace. Čímž je možné použít stejný proces konstrukce pro rozdílné reprezentace.“
Hra ke zopakování či procvičení učiva:
Tereza Bížová Představení se.
Přednášky z Distribuovaných systémů
Matematické pexeso Hra určená k opakování či procvičování učiva
AUTOR: Mgr. Hana Vrtělková NÁZEV: VY_32_INOVACE_M_06_Hra 3 TEMA: Hra 3
MS Access Tabulka letní semestr 2013.
Název: VY_32_INOVACE_ICT_7B_12B Škola:
Poměr v základním tvaru.
Seminář AMG, Písek 2018 GDPR.
Matematika + opakování a upevňování učiva
Hra (AZ kvíz) ke zopakování či procvičení učiva:
Informatika pro ekonomy přednáška 8
Vázání dat Data Binding
Odbor právní a Krajský živnostenský úřad
Hra ke zopakování či procvičení učiva:
Hra ke zopakování či procvičení učiva:
Hra (AZ kvíz) ke zopakování či procvičení učiva:
Vy_32_Inovace_14_Rozklad výrazů na součin
Opakování ze 4. cvičení int a; printf("Zadej číslo: ");
Adapter
Bridge.
Class Diagrams.
Opakování učiva pro 9. ročník
Transkript prezentace:

Memento

Motivace – kalkulačka 210° sin * /20 ? 0.25 ^2 ?

Motivace – kalkulačka 210° sin * ^2

Motivace – zálohování databáze

Memento Známý také jako Token nebo Snapshot Kategorie: Behavioral patterns (vzory chování) Účel  Uchování vnitřního stavu objektu bez porušení zapouzdření pro potřeby budoucí možnosti vrátit se k němu zpět Motivace  Undo/rollback  Checkpointy  Dočasné operace  Zotavení z chyb Použití  Obnovení operačního systému  Transakce v databázích  Složité matematické výpočty, při kterých se můžou ztratit dlouho počítaná data  Historie tahů ve hrách, načítání a ukládání stavu hry  Uchování rozmístění objektů v grafických editorech

Struktura

Originator  Objekt, který si chce nechat ukládat svůj vnitřní stav  Memento vytváří pro uchování svého vnitřního stavu  Memento využívá pro obnovení svého vnitřního stavu

Struktura Caretaker  Je zodpovědný za uchování potřebných Mement  S Mementem pracuje jako s černou skříňkou, nevidí na jeho obsah

Struktura Memento  Reprezentuje uložený vnitřní stav Originatoru  Chrání privátní data Originatora  Implementuje 2 různá rozhraní:  Wide interface – pro Originatora  Narrow interface – pro Caretakera

Interakce Caretaker požádá Originator o Memento Nějaký čas si ho podrží Kdykoli se pak může rozhodnout Memento vrátit zpět Originatoru Originator vyrobí Memento reprezentující jeho aktuální stav Originator přečte data z daného Mementa a změní svůj stav

Vlastnosti +  Stav se uchovává mimo vlastní objekt, zjednodušuje se tím Originator  Zbavuje odpovědnosti v Originatoru za zabezpečení přístupu k uloženým datům  Privátní data Originatoru uchovaná v Mementu jsou čitelná jen pro Originator samotný  Zabraňuje odhalení vnitřních implementace Originatoru  Caretaker může aplikovat různé strategie pro uchovávání a zahazování Mement  Prakticky neomezená kapacita uložených stavů lze implementovat pomocí zásobníku objektů Memento -  Může být paměťově i časově náročné, pokud jsou stavy příliš velké a kopírují se velká množství dat  Je úzce svázané s typem objektu, jehož obsah si pamatuje  Definice dvou různých rozhraní může být v některých jazycích složitá

Metody zpřístupněné Originatoru Implementace – friend (C++) class Originator { public: Memento* createMemento(); void setMemento(const Memento*); private: State* state_; }; class Memento { public: virtual ~Memento(); private: friend class Originator; Memento(); void setState(State*); State* getState(); private: State* state_; }; Memento využívá privátní metody, které zpřístupňuje Originatoru pomocí klíčového slova friend

Implementace – vnitřní třída (Java) class Originator { private String state; public Memento createMemento() { return new Memento(state); } public void setMemento(Memento memento) { state = memento.getState(); } public void doSomething(String data) { state = data; } public class Memento { private final String state; private Memento(String stateToSave) { state = stateToSave; } private String getState() { return state; } Memento je vnitřní třída Originatoru  Originator má přístup k privátním položkám Mementa

Implementace – immutable memento (C#) public class Originator { public string State { get; set; } public Memento CreateMemento() { return new Memento(State); } public void SetMemento(Memento memento) { State = memento.Data; } public class Memento { public string Data { get; private set; } public Memento(string data) { Data = data; } Memento je čitelné veřejně, ale nelze jeho stav měnit

Implementace – serializace (C#) [Serializable] class Originator { private List state = new List (); public Memento CreateMemento() { Memento memento = new Memento(); return memento.SetState(state); } public void SetMemento(Memento memento) { state = (List ) memento.GetState(); } public void DoSomething(string s) { state.Add(s); Console.WriteLine(s); } [Serializable] class Memento { MemoryStream stream = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); public Memento SetState(object o) { formatter.Serialize(stream, o); return this; } public object GetState() { stream.Seek(0, SeekOrigin.Begin); object o = formatter.Deserialize(stream); stream.Close(); return o; } Serializace Zajistí správu privátních položek a vytváření hluboké kopie stavu

Implementace – přírůstková mementa Ukládání přírůstkových změn  Memento obsahuje pouze změny vůči předcházejícímu stavu  Originator musí dostat Mementa ve správném (obráceném) pořadí  Můžeme kombinovat přírůstková Mementa s Mementy obsahujícími plný stav Line 17: + Lorem ipsum … Line 27–34: - A B C D E Line 2: + /n

Příklad – kalkulačka s historií Kalkulačka s funkcí zpět  Uživatel chce mít možnost vrátit se zpátky ve výpočtu  Ne všechny funkce jsou inverzní – je nutno použít Memento  Zabrání opakování složitých výpočtů při chybě uživatele

Příklad – kalkulačka s historií Memento Stav Originatoru (hodnota na kalkulačce) Zabrání vytváření Mementa mimo Originator class CalculatorMemento { private: friend class Calculator; CalculatorMemento(); CalculatorMemento(const double value) : value_(value) { } void setState(const double value) { value_ = value; } double getState() const { return value_; } double value_; }; Zpřístupnění privátních položek Mementa Originatoru

Příklad – kalkulačka s historií Originator Originator se nestará o objekt Mementa class Calculator { public: Calculator() : value_(0) { } void execute(const Command command, const double value) { // perform the calculation } const CalculatorMemento* createMemento() { return new CalculatorMemento(value_); } void setMemento(const CalculatorMemento* m) { value_ = m->getState(); } private: int value_; };

Příklad – kalkulačka s historií Caretaker Uložení stavu před vykonáním příkazu Caretaker má zodpovědnost za objekt Mementa Zásobník pro jednotlivá Mementa a undo operace class CalculatorCaretaker { public: void execute(const Command command, const double value) { undoStack_.push(calculator_.createMemento()); calculator_.execute(command, value); } void undo() { if (!undoStack_.empty()) { const CalculatorMemento* m = undoStack_.top(); calculator_.setMemento(m); delete m; undoStack_.pop(); } private: std::stack undoStack_; Calculator calculator_; };

Příklad – piškvorky s ukládáním hry Desková hra s možností uložit a vrátit stav hry

Příklad – piškvorky s ukládáním hry Originator class Game { [Serializable] struct State { public char[,] board; public char currentPlayer; } private State state; // Methods for initialization and playing the game, displaying the board etc. public GameSave CreateSave() { GameSave memento = new GameSave(); return memento.SetState(state); } public void RestoreSave(GameSave memento) { state = (State) memento.GetState(); }

Příklad – piškvorky s ukládáním hry Memento a Caretaker [Serializable] class GameSave { MemoryStream stream = new MemoryStream(); static BinaryFormatter formatter = new BinaryFormatter(); public GameSave SetState(object o) { formatter.Serialize(stream, o); return this; } public object GetState() { stream.Seek(0, SeekOrigin.Begin); object o = formatter.Deserialize(stream); stream.Close(); return o; } class GameSaveCaretaker { public GameSave GameSave { get; set; } }

Shrnutí Kdy využít Memento  Potřebujeme-li uložit stav objektu pro případný pozdější návrat  Je-li nepřípustné porušit zapouzdření a uveřejnit detaily implementace zvenku Související návrhové vzory  Command Může využívat Memento pro návrat operací  Iterator Mementa mohou být použita pro iteraci