1 / 19

State Pattern

Design Patterns in C#. State Pattern. http://www.devbg.org/patternscourse/. Виктор Живков. Интерконсулт България. www.icb.bg. Съдържание. Цел на шаблона Проблем, който той решава Решение Следствия от употребата Имплементация Свързани шаблони Подобни шаблони. За шаблона.

mariska
Download Presentation

State Pattern

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

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

More Related