From 8193a9a83c41e2bed1975f84502164b409eb3b61 Mon Sep 17 00:00:00 2001 From: danny Date: Thu, 18 Apr 2024 19:56:18 +0330 Subject: [PATCH 1/2] add mediator patterns --- .../behavioral patterns/9.3.4-mediator.md | 44 +++++++++++++++++- .../designPatterns/mediator-live-example.png | Bin 0 -> 8435 bytes .../designPatterns/mediator-problem1-en.png | Bin 0 -> 8463 bytes .../designPatterns/mediator-problem2.png | Bin 0 -> 2901 bytes .../designPatterns/mediator-solution1-en.png | Bin 0 -> 7116 bytes 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 static/assets/img/content/chapter9/designPatterns/mediator-live-example.png create mode 100644 static/assets/img/content/chapter9/designPatterns/mediator-problem1-en.png create mode 100644 static/assets/img/content/chapter9/designPatterns/mediator-problem2.png create mode 100644 static/assets/img/content/chapter9/designPatterns/mediator-solution1-en.png diff --git a/content/chapter 9/behavioral patterns/9.3.4-mediator.md b/content/chapter 9/behavioral patterns/9.3.4-mediator.md index 0bdfbd318..4ab66df42 100644 --- a/content/chapter 9/behavioral patterns/9.3.4-mediator.md +++ b/content/chapter 9/behavioral patterns/9.3.4-mediator.md @@ -3,4 +3,46 @@ title: '9.3.4 الگو Mediator' slug: go-mediator-pattern weight: 176004 --- -الگو Mediator... \ No newline at end of file + + +**الگوی طراحی Mediator** + +الگوی طراحی واسطه (**Mediator**)، یک الگوی رفتاری است که به شما امکان می‌دهد تا وابستگی‌های درهم‌تنیده بین اشیاء را کاهش دهید. این الگو ارتباط مستقیم بین اشیاء را محدود می‌کند و آن‌ها را مجبور می‌سازد تا تنها از طریق یک شیء واسطه با هم همکاری کنند. + +**مشکل** + +فرض کنید یک جعبه dialog برای ایجاد و ویرایش پروفایل کاربران دارید. این جعبه dialog شامل کنترل‌های مختلف فرم مانند فیلدهای متنی، کادرهای انتخابی(checkbox)، دکمه‌ها و غیره می‌شود. + + ![mediator-problem1](../../../assets/img/content/chapter9/designPatterns/mediator-problem1-en.png) + +ممکن است برخی از عناصر فرم با سایرین تعامل داشته باشند. برای مثال، انتخاب checkbox "من یک سگ دارم" ممکن است یک فیلد متنی پنهان برای وارد کردن نام سگ را نمایش دهد. مثال دیگر دکمه “ثبت” است که باید قبل از ذخیره اطلاعات، صحت مقادیر همه فیلدها را تایید کند. + + ![mediator-problem2](../../../assets/img/content/chapter9/designPatterns/mediator-problem2.png) + + +با پیاده‌سازی مستقیم این منطق درون کد عناصر فرم، باعث می‌شوید استفاده‌ی مجدد از کلاس‌های این عناصر در فرم‌های دیگر برنامه بسیار دشوار شود. برای نمونه، به دلیل وابستگی به فیلد متن سگ، نمی‌توانید از کلاس کادر انتخاب مذکور در فرم دیگری استفاده کنید. در این حالت، مجبور هستید یا از تمام کلاس‌های درگیر در نمایش فرم پروفایل استفاده کنید، یا هیچ‌کدام را به کار نبرید. + +**راه‌حل** + +الگوی طراحی Mediator پیشنهاد می‌کند که تمام ارتباط‌های مستقیم بین اجزایی که می‌خواهید مستقل از یکدیگر باشند را متوقف کنید. در عوض، این اجزا باید به صورت غیرمستقیم با هم همکاری کنند، یعنی با فراخوانی یک شیء واسطه‌ی خاص که تماس‌ها را به اجزای مناسب هدایت می‌کند. در نتیجه، اجزا تنها به یک کلاس واسطه وابسته می‌شوند، نه اینکه به ده‌ها جزء همکار دیگرشان وابسته باشند. + +در مثال فرم ویرایش پروفایل، خود کلاس باکس گفتگو می‌تواند نقش واسطه را ایفا کند. به احتمال زیاد، کلاس جعبه dialog از قبل از تمام زیرمجموعه‌هایش آگاه است، بنابراین حتی نیازی به معرفی وابستگی‌های جدید به این کلاس نخواهید داشت. + +![mediator-solution1-en](../../../assets/img/content/chapter9/designPatterns/mediator-solution1-en.png) + +مهم‌ترین تغییر در عناصر واقعی فرم اتفاق می‌افتد. بیایید دکمه‌ی “ثبت” را در نظر بگیریم. پیش از این، هر بار که کاربر روی دکمه کلیک می‌کرد، این دکمه مجبور بود صحت مقادیر تمام عناصر فرم مجزا را تایید کند. حالا تنها وظیفه‌ی دکمه، اطلاع‌رسانی به باکس گفتگو در مورد کلیک است. باکس گفتگو پس از دریافت این اطلاع‌رسانی، تایید صحت را خودش انجام می‌دهد یا این وظیفه را به عناصر مجزا واگذار می‌کند. بنابراین، به جای وابستگی به ده‌ها عنصر فرم، دکمه تنها به کلاس باکس گفتگو وابسته است. + +می‌توانید فراتر بروید و وابستگی را حتی سست‌تر کنید، با این کار که یک واسط مشترک برای تمام انواع جعبه‌های dialog تعریف کنید. این واسط، متد اطلاع‌رسانی را معرفی می‌کند که همه عناصر فرم می‌توانند از آن برای اطلاع‌رسانی به باکس گفتگو در مورد رویدادهای رخ‌داده در آن عناصر استفاده کنند. بنابراین، دکمه‌ی “ثبت” ما حالا باید بتواند با هر باکس گفتگویی که آن واسط را پیاده‌سازی می‌کند، کار کند. + +به این ترتیب، الگوی طراحی واسطه به شما امکان می‌دهد تا یک شبکه‌ی پیچیده‌ی روابط بین اشیاء مختلف را درون یک شیء واسطه‌ی واحد کپسوله‌سازی کنید. هرچه وابستگی‌های یک کلاس کمتر باشد، اصلاح، توسعه یا استفاده‌ی مجدد از آن کلاس آسان‌تر می‌شود. + +**تشبیه دنیای واقعی** + + ![mediator-live-example](../../../assets/img/content/chapter9/designPatterns/mediator-live-example.png) + +خلبانان هواپیماهایی که به منطقه‌ی کنترل فرودگاه نزدیک می‌شوند یا از آن خارج می‌شوند، به طور مستقیم با یکدیگر ارتباط برقرار نمی‌کنند. در عوض، آن‌ها با یک کنترل‌کننده‌ی ترافیک هوایی صحبت می‌کنند که در یک برج بلند، جایی در نزدیکی باند فرودگاه قرار دارد. بدون وجود کنترل‌کننده ترافیک هوایی، خلبانان باید از هر هواپیمایی در حوالی فرودگاه آگاه باشند و با یک کمیته‌ی متشکل از ده‌ها خلبان دیگر در مورد اولویت‌های فرود بحث کنند. این امر احتمالا آمار سقوط هواپیما را به طرز چشمگیری افزایش می‌داد. + +برج نیازی به کنترل کل پرواز ندارد. برج فقط برای اعمال محدودیت‌ها در منطقه‌ی ترمینال وجود دارد، زیرا تعداد بازیگران درگیر در آنجا ممکن است برای خلبان غلبه‌کننده باشد. + + +https://golangbyexample.com/mediator-design-pattern-golang/ diff --git a/static/assets/img/content/chapter9/designPatterns/mediator-live-example.png b/static/assets/img/content/chapter9/designPatterns/mediator-live-example.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8289bbb527540c5ccf9403a1c9f833eb96f277 GIT binary patch literal 8435 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 literal 0 HcmV?d00001 diff --git a/static/assets/img/content/chapter9/designPatterns/mediator-problem1-en.png b/static/assets/img/content/chapter9/designPatterns/mediator-problem1-en.png new file mode 100644 index 0000000000000000000000000000000000000000..ee476f87b00079f0581d8c7a7864666b9a901fb5 GIT binary patch literal 8463 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 rDXIjrs+9>4m6c3P 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 literal 0 HcmV?d00001 diff --git a/static/assets/img/content/chapter9/designPatterns/mediator-solution1-en.png b/static/assets/img/content/chapter9/designPatterns/mediator-solution1-en.png new file mode 100644 index 0000000000000000000000000000000000000000..2f4a6746241af846a7c6ffc952017c8477754333 GIT binary patch literal 7116 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 OkB)|cdaWuV>VE(T2YLGd literal 0 HcmV?d00001 From b8d02d54ec89eda8f1f1edfb4ce002be17306172 Mon Sep 17 00:00:00 2001 From: Danny Date: Fri, 19 Apr 2024 12:11:55 +0330 Subject: [PATCH 2/2] complete mediator pattern --- .../behavioral patterns/9.3.4-mediator.md | 317 +++++++++++++++++- 1 file changed, 309 insertions(+), 8 deletions(-) diff --git a/content/chapter 9/behavioral patterns/9.3.4-mediator.md b/content/chapter 9/behavioral patterns/9.3.4-mediator.md index 4ab66df42..fc7b6ec30 100644 --- a/content/chapter 9/behavioral patterns/9.3.4-mediator.md +++ b/content/chapter 9/behavioral patterns/9.3.4-mediator.md @@ -5,11 +5,11 @@ weight: 176004 --- -**الگوی طراحی Mediator** +## 9.3.4.1-**الگوی طراحی Mediator** الگوی طراحی واسطه (**Mediator**)، یک الگوی رفتاری است که به شما امکان می‌دهد تا وابستگی‌های درهم‌تنیده بین اشیاء را کاهش دهید. این الگو ارتباط مستقیم بین اشیاء را محدود می‌کند و آن‌ها را مجبور می‌سازد تا تنها از طریق یک شیء واسطه با هم همکاری کنند. -**مشکل** +### 9.3.4.2-**مشکل** فرض کنید یک جعبه dialog برای ایجاد و ویرایش پروفایل کاربران دارید. این جعبه dialog شامل کنترل‌های مختلف فرم مانند فیلدهای متنی، کادرهای انتخابی(checkbox)، دکمه‌ها و غیره می‌شود. @@ -22,7 +22,7 @@ weight: 176004 با پیاده‌سازی مستقیم این منطق درون کد عناصر فرم، باعث می‌شوید استفاده‌ی مجدد از کلاس‌های این عناصر در فرم‌های دیگر برنامه بسیار دشوار شود. برای نمونه، به دلیل وابستگی به فیلد متن سگ، نمی‌توانید از کلاس کادر انتخاب مذکور در فرم دیگری استفاده کنید. در این حالت، مجبور هستید یا از تمام کلاس‌های درگیر در نمایش فرم پروفایل استفاده کنید، یا هیچ‌کدام را به کار نبرید. -**راه‌حل** +### 9.3.4.3- **راه‌حل** الگوی طراحی Mediator پیشنهاد می‌کند که تمام ارتباط‌های مستقیم بین اجزایی که می‌خواهید مستقل از یکدیگر باشند را متوقف کنید. در عوض، این اجزا باید به صورت غیرمستقیم با هم همکاری کنند، یعنی با فراخوانی یک شیء واسطه‌ی خاص که تماس‌ها را به اجزای مناسب هدایت می‌کند. در نتیجه، اجزا تنها به یک کلاس واسطه وابسته می‌شوند، نه اینکه به ده‌ها جزء همکار دیگرشان وابسته باشند. @@ -30,19 +30,320 @@ weight: 176004 ![mediator-solution1-en](../../../assets/img/content/chapter9/designPatterns/mediator-solution1-en.png) -مهم‌ترین تغییر در عناصر واقعی فرم اتفاق می‌افتد. بیایید دکمه‌ی “ثبت” را در نظر بگیریم. پیش از این، هر بار که کاربر روی دکمه کلیک می‌کرد، این دکمه مجبور بود صحت مقادیر تمام عناصر فرم مجزا را تایید کند. حالا تنها وظیفه‌ی دکمه، اطلاع‌رسانی به باکس گفتگو در مورد کلیک است. باکس گفتگو پس از دریافت این اطلاع‌رسانی، تایید صحت را خودش انجام می‌دهد یا این وظیفه را به عناصر مجزا واگذار می‌کند. بنابراین، به جای وابستگی به ده‌ها عنصر فرم، دکمه تنها به کلاس باکس گفتگو وابسته است. +مهم‌ترین تغییر در عناصر واقعی فرم اتفاق می‌افتد. بیایید دکمه‌ی “ثبت” را در نظر بگیریم. پیش از این، هر بار که کاربر روی دکمه کلیک می‌کرد، این دکمه مجبور بود صحت مقادیر تمام عناصر فرم مجزا را تایید کند. حالا تنها وظیفه‌ی دکمه، اطلاع‌رسانی به جعبه dialog در مورد کلیک است. جعبه dialog پس از دریافت این اطلاع‌رسانی، تایید صحت را خودش انجام می‌دهد یا این وظیفه را به عناصر مجزا واگذار می‌کند. بنابراین، به جای وابستگی به ده‌ها عنصر فرم، دکمه تنها به کلاس باکس گفتگو وابسته است. -می‌توانید فراتر بروید و وابستگی را حتی سست‌تر کنید، با این کار که یک واسط مشترک برای تمام انواع جعبه‌های dialog تعریف کنید. این واسط، متد اطلاع‌رسانی را معرفی می‌کند که همه عناصر فرم می‌توانند از آن برای اطلاع‌رسانی به باکس گفتگو در مورد رویدادهای رخ‌داده در آن عناصر استفاده کنند. بنابراین، دکمه‌ی “ثبت” ما حالا باید بتواند با هر باکس گفتگویی که آن واسط را پیاده‌سازی می‌کند، کار کند. +می‌توانید فراتر بروید و وابستگی را حتی سست‌تر کنید، با این کار که یک واسط مشترک برای تمام انواع جعبه‌های dialog تعریف کنید. این واسط، متد اطلاع‌رسانی را معرفی می‌کند که همه عناصر فرم می‌توانند از آن برای اطلاع‌رسانی به باکس گفتگو در مورد رویدادهای رخ‌داده در آن عناصر استفاده کنند. بنابراین، دکمه‌ی «ثبت» ما حالا باید بتواند با هر جعبه dialog که آن واسط را پیاده‌سازی می‌کند، کار کند. به این ترتیب، الگوی طراحی واسطه به شما امکان می‌دهد تا یک شبکه‌ی پیچیده‌ی روابط بین اشیاء مختلف را درون یک شیء واسطه‌ی واحد کپسوله‌سازی کنید. هرچه وابستگی‌های یک کلاس کمتر باشد، اصلاح، توسعه یا استفاده‌ی مجدد از آن کلاس آسان‌تر می‌شود. -**تشبیه دنیای واقعی** +### 9.3.4.4- **تشبیه در دنیای واقعی** ![mediator-live-example](../../../assets/img/content/chapter9/designPatterns/mediator-live-example.png) خلبانان هواپیماهایی که به منطقه‌ی کنترل فرودگاه نزدیک می‌شوند یا از آن خارج می‌شوند، به طور مستقیم با یکدیگر ارتباط برقرار نمی‌کنند. در عوض، آن‌ها با یک کنترل‌کننده‌ی ترافیک هوایی صحبت می‌کنند که در یک برج بلند، جایی در نزدیکی باند فرودگاه قرار دارد. بدون وجود کنترل‌کننده ترافیک هوایی، خلبانان باید از هر هواپیمایی در حوالی فرودگاه آگاه باشند و با یک کمیته‌ی متشکل از ده‌ها خلبان دیگر در مورد اولویت‌های فرود بحث کنند. این امر احتمالا آمار سقوط هواپیما را به طرز چشمگیری افزایش می‌داد. -برج نیازی به کنترل کل پرواز ندارد. برج فقط برای اعمال محدودیت‌ها در منطقه‌ی ترمینال وجود دارد، زیرا تعداد بازیگران درگیر در آنجا ممکن است برای خلبان غلبه‌کننده باشد. +برج نیازی به کنترل کل پرواز ندارد. برج فقط برای اعمال محدودیت‌ها در منطقه‌ی فرودگاه وجود دارد. + +### 9.3.4.5- مثال + +همانطور که می‌دانیم؛ الگوی طراحی Mediator یک الگوی طراحی رفتاری است. این الگو پیشنهاد می کند برای جلوگیری از ارتباط مستقیم بین اشیاء، یک شیء میانجی ایجاد شود تا وابستگی های مستقیم بین آنها از بین برود. + +یک مثال بسیار خوب از الگوی Mediator، سکوی سیستم راه آهن است. دو قطار هرگز برای در دسترس بودن سکو با یکدیگر ارتباط برقرار نمی‌کنند. مسئول ایستگاه (stationManager) به عنوان میانجی (Mediator) عمل می کند و سکو را فقط برای یکی از قطارها در دسترس قرار می‌دهد. قطار با مسئول ایستگاه (**stationManager**) ارتباط برقرار می‌کند و بر اساس دستورات آن عمل می‌کند. این الگو صفی از قطارهای در انتظار را مدیریت می کند. در صورت خروج هر قطاری از سکو، به یکی از قطارها اطلاع می دهد که در ادامه به سکو برسد. + +توجه کنید که چگونه stationManager در کد زیر به عنوان میانجی بین trains و platform عمل می کند. + +- `passengerTrain` و `goodsTrain` رابط train را پیاده سازی می‌کنند. +- `stationManager` رابط mediator را پیاده سازی می‌کند. + +### 9.3.4.6- مثال کاربردی + + +**train.go** + +```go +package main + +type train interface { + requestArrival() + departure() + permitArrival() +} +``` + + +**passengerTrain.go** + +```go +package main + +import "fmt" + +type passengerTrain struct { + mediator mediator +} + +func (g *passengerTrain) requestArrival() { + if g.mediator.canLand(g) { + fmt.Println("PassengerTrain: Landing") + } else { + fmt.Println("PassengerTrain: Waiting") + } +} + +func (g *passengerTrain) departure() { + fmt.Println("PassengerTrain: Leaving") + g.mediator.notifyFree() +} + +func (g *passengerTrain) permitArrival() { + fmt.Println("PassengerTrain: Arrival Permitted. Landing") +} +``` + +**goodsTrain.go** + + +```go +package main + +import "fmt" + +type goodsTrain struct { + mediator mediator +} + +func (g *goodsTrain) requestArrival() { + if g.mediator.canLand(g) { + fmt.Println("GoodsTrain: Landing") + } else { + fmt.Println("GoodsTrain: Waiting") + } +} + +func (g *goodsTrain) departure() { + g.mediator.notifyFree() + fmt.Println("GoodsTrain: Leaving") +} + +func (g *goodsTrain) permitArrival() { + fmt.Println("GoodsTrain: Arrival Permitted. Landing") +} +``` + + + +**mediator.go** + + +```go +package main + +type mediator interface { + canLand(train) bool + notifyFree() +} +``` + + +**stationManager.go** + +```go +package main + +import "sync" + +type stationManager struct { + isPlatformFree bool + lock *sync.Mutex + trainQueue []train +} + +func newStationManger() *stationManager { + return &stationManager{ + isPlatformFree: true, + lock: &sync.Mutex{}, + } +} + +func (s *stationManager) canLand(t train) bool { + s.lock.Lock() + defer s.lock.Unlock() + if s.isPlatformFree { + s.isPlatformFree = false + return true + } + s.trainQueue = append(s.trainQueue, t) + return false +} + +func (s *stationManager) notifyFree() { + s.lock.Lock() + defer s.lock.Unlock() + if !s.isPlatformFree { + s.isPlatformFree = true + } + if len(s.trainQueue) > 0 { + firstTrainInQueue := s.trainQueue[0] + s.trainQueue = s.trainQueue[1:] + firstTrainInQueue.permitArrival() + } +} +``` + + +**main.go** + +```go +package main + +func main() { + stationManager := newStationManger() + passengerTrain := &passengerTrain{ + mediator: stationManager, + } + goodsTrain := &goodsTrain{ + mediator: stationManager, + } + passengerTrain.requestArrival() + goodsTrain.requestArrival() + passengerTrain.departure() +} +``` + + +**Output:** + +```go +PassengerTrain: Landing +GoodsTrain: Waiting +PassengerTrain: Leaving +GoodsTrain: Arrival Permitted. Landing +``` + + + +## **Full Working Code:** + + +```go +package main + +import ( + "fmt" + "sync" +) + +type train interface { + requestArrival() + departure() + permitArrival() +} + +type passengerTrain struct { + mediator mediator +} + +func (g *passengerTrain) requestArrival() { + if g.mediator.canLand(g) { + fmt.Println("PassengerTrain: Landing") + } else { + fmt.Println("PassengerTrain: Waiting") + } +} + +func (g *passengerTrain) departure() { + fmt.Println("PassengerTrain: Leaving") + g.mediator.notifyFree() +} + +func (g *passengerTrain) permitArrival() { + fmt.Println("PassengerTrain: Arrival Permitted. Landing") +} + +type goodsTrain struct { + mediator mediator +} + +func (g *goodsTrain) requestArrival() { + if g.mediator.canLand(g) { + fmt.Println("GoodsTrain: Landing") + } else { + fmt.Println("GoodsTrain: Waiting") + } +} + +func (g *goodsTrain) departure() { + g.mediator.notifyFree() + fmt.Println("GoodsTrain: Leaving") +} + +func (g *goodsTrain) permitArrival() { + fmt.Println("GoodsTrain: Arrival Permitted. Landing") +} + +type mediator interface { + canLand(train) bool + notifyFree() +} + +type stationManager struct { + isPlatformFree bool + lock *sync.Mutex + trainQueue []train +} + +func newStationManger() *stationManager { + return &stationManager{ + isPlatformFree: true, + lock: &sync.Mutex{}, + } +} + +func (s *stationManager) canLand(t train) bool { + s.lock.Lock() + defer s.lock.Unlock() + if s.isPlatformFree { + s.isPlatformFree = false + return true + } + s.trainQueue = append(s.trainQueue, t) + return false +} + +func (s *stationManager) notifyFree() { + s.lock.Lock() + defer s.lock.Unlock() + if !s.isPlatformFree { + s.isPlatformFree = true + } + if len(s.trainQueue) > 0 { + firstTrainInQueue := s.trainQueue[0] + s.trainQueue = s.trainQueue[1:] + firstTrainInQueue.permitArrival() + } +} + +func main() { + stationManager := newStationManger() + passengerTrain := &passengerTrain{ + mediator: stationManager, + } + goodsTrain := &goodsTrain{ + mediator: stationManager, + } + passengerTrain.requestArrival() + goodsTrain.requestArrival() + passengerTrain.departure() +} +``` + +**Output:** + +```go +PassengerTrain: Landing +GoodsTrain: Waiting +PassengerTrain: Leaving +GoodsTrain: Arrival Permitted. Landing +``` -https://golangbyexample.com/mediator-design-pattern-golang/