Download
slide1 n.
Skip this Video
Loading SlideShow in 5 Seconds..
State Pattern PowerPoint Presentation
Download Presentation
State Pattern

State Pattern

112 Views Download Presentation
Download Presentation

State Pattern

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Design Patterns in C# State Pattern http://www.devbg.org/patternscourse/ Виктор Живков Интерконсулт България www.icb.bg

  2. Съдържание • Цел на шаблона • Проблем, който той решава • Решение • Следствия от употребата • Имплементация • Свързани шаблони • Подобни шаблони

  3. За шаблона • Отделя отделните състояния на обект в собствен клас • Клиентът не разбира за различните състояния, защото обектът, с който работи не се променя – променя се неговото състояние и поведение

  4. Проблем • Помага ни да избегнем чести, дълги и повтарящи се проверки за извикването на правилен метод • Капсулира специфичното поведение на всяко състояние в нов клас • Например – Как човек комуникира с други в зависимост от настроението си?

  5. Структура

  6. Роля на класовете • Context • Дефинира интерфейс, който клиентите ползват • Поддържа инстанция на обект с текущото състояние • State • Дефинира интерфейс за поведението на всяко от състоянията • ConcreteState • Имплементира поведението според смисъла на състоянието, което представя

  7. Взаимодействие между класовете • Клиентът създава обекта Context • При извикване на метод, свързан с текущото състояние, извикването се делегира към съответния метод на състоянието • ConcreteState изпълнява заявката и при нужда променя състоянието на Context • При нужда самият Context може да промени състоянието си

  8. Пред-имплементация • За имплементирането на базовия State можем да използваме: • Абстрактен клас • Интерфейс В С# е препоръчително (!) да се използва интерфейс. Причина: • Запазване на наследяването за нещо по-важно и смислено, което не може да бъде реализирано с интерфейс

  9. Имплементация Типът Context: public class Person { public readonly string Name; public readonly int Age; public IMood mood; public Person(string name, int age) { Name = name; Age = age; mood = new NormalMood(); } private IMood GetMood(Person currentPerson) { return new NormalMood(); } public void InitContact(Person person) { mood = GetMood(person); } public void Meet() { mood.Meet(); } public void Greet() { mood.Greet(); } public void Talk() {mood.Talk(); } public void Flirt() {mood.Flirt(); } public void Bye() {mood.Bye(); } }

  10. Имплементация Типът State: public interface IMood { void Meet(); void Greet(); void Talk(); void Flirt(); void Bye(); }

  11. Имплементация Типът ConcreteState: public class NormalMood : IMood { public NormalMood() { } public void Meet() { Console.WriteLine("[Tries to shake hands.]"); } public void Greet() { Console.WriteLine("Hello."); } public void Talk() { Console.WriteLine("We have wonderful weather these days...");} public void Flirt() { Console.WriteLine("Do you want to go with me to cinema?");} public void Bye() {Console.WriteLine("Goodbye!"); } }

  12. Имплементация Употреба на типовете: static void Main() { Person gergi = new Person(“Gergi”, 19); Person minka = new Person(“Minka”, 18); gergi.InitContact(minka); minka.InitContact(gergi); gergi.Meet(); minka.Meet(); gergi.Greet(); minka.Greet(); }

  13. Демонстрация • Срещи и настроения

  14. Препоръки • Използвайте интерфейс за общия тип на състоянията • При нужда използвайте таблици на състояния • Използвайте Singleton при споделяне на състояния • Внимавайте кой дирижира смяната на състоянията! • Не позволявайте на клиента да разбира за различните състояния!

  15. Следствия • Локализираме на едно място всички прояви на дадено състояние • Отделяме строго всяко отделно поведение от останалите • Лесна смяна на състоянията • Споделяне на обектите за състояние • Създава се нова йерархия за всяко едно състояние

  16. Свързани шаблони • Method Factory – подходящ за създаване на конкретния тип от обект (състояние). • Mini Object – Използва се при споделяне на инстанции на състояния между няколко Context обекта. • Singleton – Незаменим, ако изискванията го налагат.

  17. Упражнения • Реализирайте поведението на банкова сметка (account) според това колко пари има в нея. Използвайте 3 състояния: • RedState – пари <= 0 • NormalState – пари > 0 и пари < 10 00 • GoldState – пари > 10 000 Каква да бъде разликата в поведението преценете сами. Използвайте шаблона State!

  18. Шаблони задизайн с C# Въпроси? www.devbg.org/patternscourse/

  19. Използвана литература • Ерик Гама, Ричард Хелм, Ралф Джонсън, Джон Влисидес, Шаблони за дизайн, СофтПрес, 2005, ISBN 954-685-352-6