190 likes | 319 Views
Design Patterns in C#. State Pattern. http://www.devbg.org/patternscourse/. Виктор Живков. Интерконсулт България. www.icb.bg. Съдържание. Цел на шаблона Проблем, който той решава Решение Следствия от употребата Имплементация Свързани шаблони Подобни шаблони. За шаблона.
E N D
Design Patterns in C# State Pattern http://www.devbg.org/patternscourse/ Виктор Живков Интерконсулт България www.icb.bg
Съдържание • Цел на шаблона • Проблем, който той решава • Решение • Следствия от употребата • Имплементация • Свързани шаблони • Подобни шаблони
За шаблона • Отделя отделните състояния на обект в собствен клас • Клиентът не разбира за различните състояния, защото обектът, с който работи не се променя – променя се неговото състояние и поведение
Проблем • Помага ни да избегнем чести, дълги и повтарящи се проверки за извикването на правилен метод • Капсулира специфичното поведение на всяко състояние в нов клас • Например – Как човек комуникира с други в зависимост от настроението си?
Роля на класовете • Context • Дефинира интерфейс, който клиентите ползват • Поддържа инстанция на обект с текущото състояние • State • Дефинира интерфейс за поведението на всяко от състоянията • ConcreteState • Имплементира поведението според смисъла на състоянието, което представя
Взаимодействие между класовете • Клиентът създава обекта Context • При извикване на метод, свързан с текущото състояние, извикването се делегира към съответния метод на състоянието • ConcreteState изпълнява заявката и при нужда променя състоянието на Context • При нужда самият Context може да промени състоянието си
Пред-имплементация • За имплементирането на базовия State можем да използваме: • Абстрактен клас • Интерфейс В С# е препоръчително (!) да се използва интерфейс. Причина: • Запазване на наследяването за нещо по-важно и смислено, което не може да бъде реализирано с интерфейс
Имплементация Типът 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(); } }
Имплементация Типът State: public interface IMood { void Meet(); void Greet(); void Talk(); void Flirt(); void Bye(); }
Имплементация Типът 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!"); } }
Имплементация Употреба на типовете: 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(); }
Демонстрация • Срещи и настроения
Препоръки • Използвайте интерфейс за общия тип на състоянията • При нужда използвайте таблици на състояния • Използвайте Singleton при споделяне на състояния • Внимавайте кой дирижира смяната на състоянията! • Не позволявайте на клиента да разбира за различните състояния!
Следствия • Локализираме на едно място всички прояви на дадено състояние • Отделяме строго всяко отделно поведение от останалите • Лесна смяна на състоянията • Споделяне на обектите за състояние • Създава се нова йерархия за всяко едно състояние
Свързани шаблони • Method Factory – подходящ за създаване на конкретния тип от обект (състояние). • Mini Object – Използва се при споделяне на инстанции на състояния между няколко Context обекта. • Singleton – Незаменим, ако изискванията го налагат.
Упражнения • Реализирайте поведението на банкова сметка (account) според това колко пари има в нея. Използвайте 3 състояния: • RedState – пари <= 0 • NormalState – пари > 0 и пари < 10 00 • GoldState – пари > 10 000 Каква да бъде разликата в поведението преценете сами. Използвайте шаблона State!
Шаблони задизайн с C# Въпроси? www.devbg.org/patternscourse/
Използвана литература • Ерик Гама, Ричард Хелм, Ралф Джонсън, Джон Влисидес, Шаблони за дизайн, СофтПрес, 2005, ISBN 954-685-352-6