در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش دیزاین پترن (Design Patterns) قسمت 11 : الگوی State

با سلام به همه دوستان و همراهان Itpro. در ادامه مباحث الگوهای طراحی در این مطلب قصد دارم که به الگوی state بپردازم، امیدوارم که مفید باشد. الگوی state یک الگوی رفتاری می باشد. این الگو سازوکاری میچیند که ارتباطات بین کلاس ها و موجودیت ها کنترل شود. این الگو را می توان نسخه پویا و دینامیک الگوی strategy دانست. رفتار این الگو به این شکل است که وقتی که حالت داخلی یک شی تغییر می کند با توجه به آن تغییر این الگو رفتار خود را تغییر می دهد. این تغییر با تغییر اعمال درون الگو می باشد. این عمل در صورتی قابل انجام است که برای یک شی تعریف شده زیر کلاس (subclass) آن را تغییر بدهیم.

شرح الگو

یک برنامه پرواز را در نظر بگیرید که توسط یک شرکت هواپیمایی استفاده می شود. کار این برنام به این شکل است که هر مسافر که برای اولین بار برای پرواز به این شرکت می آید در وضعیت آبی قرار دارد. سیستم برای مسافران وضعیت آبی امکانات و تسهیلات خاصی در نظر می گیرد. و قیمت پرواز را برای آنان به گونه ای حساب می کند که تخفیف ندارد و همچنین مسافت پروازی آنان نیز محدود است. بعد از 5 پرواز که همان مسافر با این شرکت هواپیمایی انجام داد و پروازش در این سیستم ثبت شد مسافر از وضعیت آبی به وضعیت نقره ای ارتقاع پیدا می کند. سیستم برای مسافران وضعیت نقره ای برای هر پرواز 5 درصد تخفیف در نظر می گیرد و همچنین مسافت پرواز را به اندازه ای افزایش می دهد. حال اگر شخصی بیش از 15 پرواز انجام داده باشد به وضعیت طلایی خواهد رسید و برای هر پرواز 15 درصد تخیفیف خواهد گرفت. دقت کنید که مسافر باید این پرواز ها را در طول یک سال انجام دهد. حال وضعیت مسافر را توسط الگوی State پیاده سازی می کنیم. در الگوی State رفتار کلاس با توجه به حالت (State) کلاس تغییر می کند. این الگو یک الگوی رفتاری است. در این الگو ما اشیائی را می سازیم که حالت های مختلف یک کلاس را دارا می باشد.

طراحی الگوی State

الگوی State بین کلاس Context و State یک تعامل جالب ایجاد می کند. کلاس Context شامل اطلاعاتی است که اکثرا ثابت است در حالی که State می تواند در طی اجرای برنامه تغییر کند. کلاس UML این ای الگو به شکل زیر است.

آموزش دیزاین پترن (Design Patterns) قسمت 11 : الگوی State

همانطور که در شکل مشاهده می شود اجزای این الگو عبارتند از:

  • Context کلاسی که یک شی از State را نگهداری می کند.
  • IState یک اینترفیس برای حالت های Context تعریف می کند.
  • StateA و StateB کلاس هایی که حالت هایی از Context را دارا می باشند.

کلاس Context یک متغیر از نوع IState در خود دارد که به یک شی خاص (مثل stateA) اشاره می کند. همه ی عملیات از طریق متد Handle انجام می شوند. همانطور که در شکل دیده می شود کلاس State به داده های Context دسترسی کامل دارد. بنابراین در هر زمانی هم کلاس Context و هم شی State می توانند تصمیم بگیرند که تغییر حالت بدهند. این کار با انتساب ویژگی های state جدید به شی Context صورت می گیرد. وقتی که این کار انجام شود همه ی درخواست ها به state جدید ارسال می شوند. که ممکن است اعمالی که در این State انجام می شود با اعمال State قبلی کاملا متفاوت باشد.

پیاده سازی

همانند الگوی استراتژی الگوی State هم به مکانیزم اینترفیس و تجمع بستگی دارد. در مثال زیر دو کلاس state به نام های NormalState و FastState وجود دارد که برای شمارش شمارنده داخل کلاس Context با سرعت های متفاوتی عمل می کنند. هر دو کلاس اینترفیس IState را پیاده سازی می کنند و هردو کلاس ها دارای دو تابع MoveUpو MoveDown هستند. خود state ها تصمیم می گیرند که چه زمانی به state دیگر سوییچ کنند. در این مثال بر پایه مقدار عددی شماره تصمیم گیری می شود.

using System;
using System.Collections.Generic;
interface IState {
 int MoveUp(Context context);
int MoveDown(Context context);
}

// State 1
class NormalState : IState {
public int MoveUp(Context context) {
context.Counter+=2;
return context.Counter;
}

public int MoveDown(Context context) {
if (context.Counter < Context.limit) {
context.State = new FastState( );
Console.Write("|| ");
}
context.Counter-=2;
return context.Counter;
}
}

// State 2
class FastState : IState {
public int MoveUp(Context context) {
context.Counter+=5;
return context.Counter;

}

public int MoveDown(Context context) {
if (context.Counter < Context.limit) {
context.State = new NormalState( );
Console.Write("||");
}
context.Counter-=5;
return context.Counter;
}
}

// Context
class Context {
public const int limit = 10;
public IState State {get; set; }
public int Counter = limit;
public int Request(int n) {
if (n==2)
return State.MoveUp(this);
else
return State.MoveDown(this);
}
}

static class Program {
// The user interface
static void Main ( ) {
Context context = new Context( );
context.State = new NormalState( );
Random r = new Random(37);
for (int i = 5; i<=25; i++) {
int command = r.Next(3);
Console.Write(context.Request(command)+" ");
}
Console.WriteLine( );
}
}

خروجی این کد به شکل زیر خواهد بود

8 10 8 || 6 11 16 11 6 ||1 3 || 1 ||-4 || -6 -1 4 ||-1 || -3 2 7 ||2 4

دقت کنید که علامت || در خروجی نشان دهنده محل تغییر state می باشد. مسئله ای که قابل تامل است این است که آیا ما اشیا State را د آغاز برنامه بسازیم یا ساخت آنها را به زمان نیاز داشتن به آن اشیا موکول کنیم. انجام این کار بستگی به تعداد دفعات تغییر حالت در برنامه و اندازه داده شی State بستگی دارد. برای حالت هایی که تغییرات زیادی داریم بهتر است که شی را از همان ابتدا بسازیم.

موارد استفاده

این الگو برای پیاده سازی ابزارهای گرافیکی مورد استفاده قرار بگیرد و در کل برای اشیائی که باید در زمان اجرا تغییر کند. همچنین برای اشیایی که در حال پیچیده شدن هستند و شرط های زیادی دارند قابل استفاده است. ITPro باشید

نویسنده : مهدی عادلی

منبع : جزیره برنامه نویسی وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

#آموزش_design_pattern #آموزش_الگوهای_طراحی #مهندسی_نرم_افزار #الگوهای_طراحی_در_نرم_افزار #آموزش_الگوی_state #آموزش_برنامه_نویسی_شئ_گرا #design_pattern_چیست؟ #آموزش_برنامه_نویسی #الگوهای_طراحی_شی_گرا
عنوان
1 آموزش دیزاین پترن (Design Patterns) قسمت 1 : اطلاعات پایه رایگان
2 آموزش دیزاین پترن (Design Patterns) قسمت 2 : معرفی الگوها رایگان
3 آموزش دیزاین پترن (Design Patterns) قسمت 3 : Singleton و Adapter رایگان
4 آموزش دیزاین پترن (Design Patterns) قسمت 4 : الگوی Observer رایگان
5 آموزش دیزاین پترن (Design Patterns) قسمت 5 : الگوی Iterator رایگان
6 آموزش دیزاین پترن (Design Patterns) قسمت 6 : الگوی Command رایگان
7 آموزش دیزاین پترن (Design Patterns) قسمت 7 : الگوی Mediator رایگان
8 آموزش دیزاین پترن (Design Patterns) قسمت 8 : الگوی Memento رایگان
9 آموزش دیزاین پترن (Design Patterns) قسمت 9 : الگوی Strategy رایگان
10 آموزش دیزاین پترن (Design Patterns) قسمت 10 :الگوی Factory Method رایگان
11 آموزش دیزاین پترن (Design Patterns) قسمت 11 : الگوی State رایگان
زمان و قیمت کل 0″ 0
3 نظر
yshakoury

با سپاس از توضیحات خوبتون درباره الگوهای طراحی، بقیه ام وقت کردین بذارین خیلی مفید بود

Saman-66

با سلام ... میخواستم بدونم یادگیری این 10تا الگو کافی هست یا بهتر بقیه الگوهای طراحی رو هم یاد بگیریم...؟

و آیا بقیه الگوها رو هم قرار می دید یا نه؟

مهدی عادلی فر

سلام بستگی به استفاده شما و کاری که می خواهید انجام دهید دارد. الگو های گفته خیلی مهم هستند. ادامه الگو ها به زودی قرار داده خواهد شد.

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....