Understanding the State Design Pattern in C#
The State Design Pattern encapsulates the varying behavior of an object based on its internal state. It allows an object to change its behavior when its state changes, eliminating the need for cumbersome conditional logic. This pattern involves defining state-specific classes, each handling different behaviors. For example, a person can interact differently based on their mood. This article details the structure, implementation, and usage of the State Pattern in C#, along with examples demonstrating its effectiveness in software development.
Understanding the State Design Pattern in C#
E N D
Presentation Transcript
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