170 likes | 302 Views
Design Patterns. http://www.devbg.org/patternscourse. Memento Pattern. Галин Илиев MCSD.NET . iliev@galcho.com. TSCG www.wordassist.com. Съдържание. Проблем Структура на шаблона Примерна реализация Въпроси при реализацията За и против шаблона Упражнения. Проблем.
E N D
Design Patterns http://www.devbg.org/patternscourse Memento Pattern Галин Илиев MCSD.NET iliev@galcho.com TSCG www.wordassist.com
Съдържание • Проблем • Структура на шаблона • Примерна реализация • Въпроси при реализацията • За и против шаблона • Упражнения
Проблем • Запазване на състоянието на обект • Възстановяване на състоянието на по-късен етап • Не се нарушава капсулацията на данните
Структура на шаблона • Участващи обекти са: • Спомен (Memento) • Запазва вътрешното състояние на обекта Създател • Предоставя достъп само на обекти от типа Създател • Създател (Originator) • Създава обект Спомен, съдържащ “снимка” на състоянието • Използва обект Спомен, за да въстанови предишното състояние
Структура на шаблона • Уредник(Caretaker) • Отговорен е за съхранението на съдържанието на обекта Спомен • Не обработва или достъпва съдържанието на обекта Спомен
Примерна реализация • Идентифициране на обектите • MementoBase – абстрактен клас • Memento – конкретен клас • SalesProspect – Създател (Originator) • ProspectMemory – Уредник(Caretaker)
Примерна реализация public abstract class MementoBase { public abstract MementoBase SetState(object State); public abstract object GetState(); } class SalesProspect { private class Memento : MementoBase { public override object GetState() { ArrayList al = new ArrayList(3); al.Add(this.name);
Примерна реализация al.Add(this.phone); al.Add(this.budget); return al; } public override MementoBase SetState(object state) { ArrayList al = (ArrayList)state; if (al.Count != 3) throw new ArgumentException("State doesn't have expected number of members!", "state"); this.name = al[0].ToString(); this.phone = al[1].ToString(); this.budget = double.Parse(al[2].ToString()); return this; }
Демонстрация #1 • Примерeна реализация на шаблона “Спомен”
Въпроси при реализацията • Поддръжка на два интерфейса • Широк - за Създател (Originator) • Тесен – за останалите • Инкрементално съхранение на промените • Неизвестен размер на обекта Уредник (Caretaker)
За и против шаблона • Запазва капсулацията на данните • Елиминира нуждата от копиране на целия обект с цел запазване на състоянието • Подсигуряване чрез имплементацията (readonly properties) • Опростява обекта Създател (Originator)
За и против шаблона • Логиката по съхранение се прехвърля в обекта Уредник(Caretaker) • Трябва да предостави два интерфейса • За обекта Създател • За другите обекти • Може да заеме много памет
Шаблон “Спомен”(Memento) Въпроси?
Използвана литература • Ерик Гама, Ричард Хелм, Ралф Джонсън, Джон Влисидес, Шаблони за дизайн, СофтПрес, 2005, ISBN 954-685-352-6 • Mementos, Marc Clifton , www.codeproject.com • http://www.dofactory.com/Patterns/Patterns.aspx