> For the complete documentation index, see [llms.txt](https://moeindeveloper.gitbook.io/maad/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://moeindeveloper.gitbook.io/maad/mvvm-model-view-viewmodel.md).

# MVVM(Model-View-ViewModel)

در این قسمت معماری نرم افزار مدل-ویو-ویومدل به زبانی ساده توضیح خواهیم داد

## ویدیو در آپارات:

{% embed url="<https://www.aparat.com/v/UYuIe>" %}

## توضیح:

![](https://2067729193-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LPviufqZ7Hy3c8e-vKH%2F-LQKKMdmRtmoiV9L6A7f%2F-LQKKXgtm1O9jnTJj29B%2F1_UDzzNYwInvHg25V_OtWejg.jpeg?alt=media\&token=2a01634a-f45a-41f6-8a78-5c1b72fe4d2f)

### &#x20;وظایف:

**مدل(Model):** وظیفه تامین اطلاعات را برای **ویومدل(ViewModel)** به عهده دارد. اطلاعات می توانند از سرور، پایگاه داده محلی و .. باشند.

**ویومدل(ViewModel):** وظیفه رساندن اطلاعات و کنترل آن ها را به عهده دارد. از دیگر وظایف **ویومدل**، اتصال *اکتیویتی(Activity)/فرگمنت(Fragment)* به سایر بخش های *اپلیکیشن* می باشد!

**ویو(View):** وظیفه آن نمایش اطلاعات، و واکنش پذیری نسبت به اعمال کاربر و سیستم بر روی صفحه(مانند: لمس کردن دکمه و یا تماس ورودی که مربوط به اعمال سیستم می باشد) . مثالی از ویو در اندروید:  *اکتیویتی(Activity) و فرگمنت(Fragment)*.

### ارتباط:

**مدل(Model):** نباید از قسمت های دیگر *اپلیکیشن* خبر ***داشته*** باشد! فقط دارای ***یک خروجی*** دیتا می باشد! به زبانی ساده تر نباید از کدهای اندروید درون مدل استفاده شود! (مثال: چک کردن وضعیت اتصال به اینترنت)

**ویومدل(ViewModel):** یک **instance** از مدل را درون خود حفظ میکند تا اطلاعات را از آن بگیرد ولی مانند **ویو** یک خروجی برای اطلاعات دارد! **ویومدل** همانند **مدل** نباید درون آن از کدهای اندروید استفاده کرد و هیچ گونه ارتباطی با **ویو** ندارد!

**ویو(View):** نباید بداند که **مدل** چیست و اطلاعات از کجا می آید! **ویو** فقط وظیفه گوش دادن به اطلاعاتی را دارد که از **ویومدل** *ساطع* می شود! یعنی یک **instance** از **ویومدل** را درون خود نگه میدارد که به اطلاعاتی که از آن ارسال می شود را شنود کند.

### مزایا استفاده از این معماری:

کدی خوانا تر، قابل تست و مرتب تر! **دیباگینگ(Debuging)** راحت تر و قابلیت نوشتن تست برای کد!

## توضیحی ساده تر:

فرض کنید به **رستورانی** می روید، **گارسون** به سراغ شما می آید و از شما می خواهد که **چیزی** سفارش دهید! بعد از سفارش، گارسون درخواست شما را به گوش **آشپز** می رساند؛ **آشپز** با استفاده از مواد **موجود** در **آشپزخانه**، **سفارش** شما را آماده می کند و به **گارسون** می دهد تا به **شما** برسد! این یک مثال ساده از معماری **MVVM** بود! به همین راحتی! چطور؟؟ به عکس زیر دقت کنید:

![](https://2067729193-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LPviufqZ7Hy3c8e-vKH%2F-LQKRCbMOKNv93qdvqgm%2F-LQKSKLKc4jzxFfgkhLS%2FMVVM.png?alt=media\&token=e88c4049-44f6-4c6c-97c6-6d475d1706d3)

شما در اینجا نقش **ویو(View)** را به عنوان **مشتری** اجرا می کنید، **گارسون** نقش **ویومدل(ViewModel)** و **آشپز**، نقش **مدل(Model)** را اجرا می کند! شما با درخواست کردن از **گارسون(ویومدل)** از او می خواهید که برای شما **چیزی(Data)** بیاورد و در اینجا **گارسون(ویومدل)** به **آشپز(مدل)** دستور می دهد که چه چیزی برای **مشتری(ویو)** می خواهد؛ و **آشپز(مدل)** با **مواد** **موجود** در **آشپزخانه(Repository)** سفارش **مشتری(ویو)** را آماده می کند و **گارسون(ویومدل)** منتظر می ماند که وقتی **سفارش(Data)** ***آماده شد***، آن را به **مشتری(ویو)** تحویل دهد و در صورت بروز **مشکلی** در آماده سازی **سفارش(Data)**، **مشتری(ویو)** را آگاه کند که یا **سفارشی** دیگر بدهد یا اینکه **رستوران** را ترک کند!

در این مثال ساده مشاهده کردید که **اعضا** با یک دیگر ***ارتباطی ندارند*** و **مشتری** نمی داند که **سفارش(اطلاعات)** چگونه ***آماده می شوند*** و ***فقط می داند*** که **سفارش**(**اطلاعات)** از طریق **گارسون(ویومدل)** به او می رسد! **آشپز(مدل)** نیز نمی داند که **مشتری(ویو)** کیست! به همین راحتی!

پی نوشت:‌ در ادامه، با افزودن **RxJava**، این تعریف را کامل تر خواهیم کرد!
