
الگوی طراحـــــــــی State
الگوی طراحی State یک الگوی رایج در برنامهنویسی است که برای مدیریت حالتها و رفتارهای یک شیء در زمان اجرا مفید است. این الگو به ما امکان میدهد تغییر رفتار شیء به صورت پویا بر اساس حالتهای مختلف آن را فراهم کند. این الگو باعث جدا کردن انتقال میان حالتها از شیء و مدیریت آنها میشود.
مفهوم الگوی State به این صورت است که ما یک کلاس Context داریم که حالتها را مدیریت میکند و به صورت پویا تغییراتی را در رفتار اجزاء شیء اعمال میکند. همچنین کلاس State نیز وجود دارد که رفتارهای مختلف را تعریف میکند و به کمک رابطی از Context به آن دسترسی دارد.
معمولاً اجزاء اصلی الگوی طراحی State شامل موارد زیر هستند:
1. Context: کلاسی است که حالتها را مدیریت میکند و رفتارها را بر اساس حالتها تغییر میدهد.
2. State: رابط یا کلاسی است که رفتارها را تعریف میکند و به کمک Context، رفتارها را به شیء اعمال میکند.
3. ConcreteState: کلاسهایی هستند که از کلاس State ارثبری میکنند و رفتارهای مختلف را به شیء اعمال میکنند.
برای درک بهتر این الگو، با یک مثال ملموس و کاربردی در دنیای واقعی آشنا میشویم:
فرض کنید ما یک پلیر موسیقی داریم که قابلیتهای پخش، توقف و مکث موسیقی را دارد. برای هر کدام از این حالتها، رفتارهای مختلفی برای پلیر تعریف میکنیم و با استفاده از الگوی State، پلیر قادر به تغییر رفتار خود بر اساس حالتهای مختلف میشود.
1. State:
1public interface IPlayerState
2{
3 void Play();
4 void Pause();
5 void Stop();
6}
2. ConcreteState:
1public class PlayState : IPlayerState
2{
3 public void Play()
4 {
5 Console.WriteLine("Music is already playing.");
6 }
7
8 public void Pause()
9 {
10 Console.WriteLine("Music paused.");
11 }
12
13 public void Stop()
14 {
15 Console.WriteLine("Music stopped.");
16 }
17}
18
19public class PauseState : IPlayerState
20{
21 public void Play()
22 {
23 Console.WriteLine("Music resumed.");
24 }
25
26 public void Pause()
27 {
28 Console.WriteLine("Music is already paused.");
29 }
30
31 public void Stop()
32 {
33 Console.WriteLine("Music stopped.");
34 }
35}
36
37public class StopState : IPlayerState
38{
39 public void Play()
40 {
41 Console.WriteLine("Music started playing.");
42 }
43
44 public void Pause()
45 {
46 Console.WriteLine("Music cannot be paused. It's stopped.");
47 }
48
49 public void Stop()
50 {
51 Console.WriteLine("Music is already stopped.");
52 }
53}
3. Context:
1public class MusicPlayer
2{
3 private IPlayerState _state;
4
5 public MusicPlayer()
6 {
7 // حالت اولیه پخش
8 _state = new PlayState();
9 }
10
11 public void SetState(IPlayerState state)
12 {
13 _state = state;
14 }
15
16 public void Play()
17 {
18 _state.Play();
19 }
20
21 public void Pause()
22 {
23 _state.Pause();
24 }
25
26 public void Stop()
27 {
28 _state.Stop();
29 }
30}
4. Client (کلاینت):
1public class Program
2{
3 public static void Main()
4 {
5 MusicPlayer player = new MusicPlayer();
6
7 // پخش موسیقی
8 player.Play();
9
10 // توقف موسیقی
11 player.Stop();
12
13 // مکث موسیقی
14 player.Pause();
15
16 // پخش مجدد موسیقی
17 player.Play();
18 }
19}
خروجی برنامه به صورت زیر خواهد بود:
Music is already playing.
Music stopped.
Music is already stopped.
Music paused.
Music resumed.
در این مثال، با استفاده از الگوی State، ما یک پلیر موسیقی ساده ایجاد کردیم که به صورت پویا رفتارهای خود را بر اساس حالتهای مختلف تغییر میدهد. هر حالت رفتار متفاوتی را به پلیر اعمال میکند و با تغییر حالت، رفتار پلیر به صورت خودکار تغییر میکند. این الگو امکان توسعهپذیری سیستم را بالا میبرد و باعث جدا کردن انتقال بین حالتها از شیء میشود.