You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/chapter 9/behavioral patterns/9.3.6-observer.md
+101-1Lines changed: 101 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,4 +3,104 @@ title: '9.3.6 الگو Observer'
3
3
slug: go-observer-pattern
4
4
weight: 176006
5
5
---
6
-
الگو Observer...
6
+
7
+
## 9.3.6.1 - توضیح الگوی Observer
8
+
9
+
الگوی Observer یک الگوی طراحی رفتاری است که رابطهی یک-به-چند بین اشیا را تعریف میکند، به طوری که وقتی یک شیء (سوژه) حالت خود را تغییر میدهد، تمام اشیای وابسته به آن (ناظرها) به طور خودکار مطلع و به روز میشوند. این الگو برای ایجاد سیستمهای event-driven ایدهآل است و وابستگی قوی بین سوژه و ناظرها را از بین میبرد، زیرا سوژه نیازی ندارد بداند ناظرهایش چه اشیایی هستند و فقط با آنها از طریق یک رابط مشترک تعامل میکند. این الگو در موقعیتهایی مانند سیستمهای اطلاعرسانی، رابطهای کاربری reactive و رویدادهای real-time کاربرد گستردهای دارد.
10
+
11
+
## 9.3.6.2 - مثال عملی
12
+
13
+
{{< play >}}
14
+
package main
15
+
16
+
import "fmt"
17
+
18
+
// Observer interface
19
+
type Observer interface {
20
+
Update(temperature float64)
21
+
}
22
+
23
+
// Subject interface
24
+
type Subject interface {
25
+
RegisterObserver(o Observer)
26
+
RemoveObserver(o Observer)
27
+
NotifyObservers()
28
+
}
29
+
30
+
// Concrete Subject - WeatherStation
31
+
type WeatherStation struct {
32
+
temperature float64
33
+
observers []Observer
34
+
}
35
+
36
+
func (w *WeatherStation) RegisterObserver(o Observer) {
37
+
w.observers = append(w.observers, o)
38
+
}
39
+
40
+
func (w *WeatherStation) RemoveObserver(o Observer) {
fmt.Printf("Phone Display %s: Temperature is %.1f°C\n", p.id, temperature)
67
+
}
68
+
69
+
// Concrete Observer - TVDisplay
70
+
type TVDisplay struct {
71
+
channel string
72
+
}
73
+
74
+
func (t *TVDisplay) Update(temperature float64) {
75
+
fmt.Printf("TV Display on %s: Current temperature: %.1f°C\n", t.channel, temperature)
76
+
}
77
+
78
+
func main() {
79
+
// Create the subject (weather station)
80
+
weatherStation := &WeatherStation{}
81
+
82
+
// Create observers
83
+
phone1 := &PhoneDisplay{id: "1"}
84
+
phone2 := &PhoneDisplay{id: "2"}
85
+
tv := &TVDisplay{channel: "Weather Channel"}
86
+
87
+
// Register observers
88
+
weatherStation.RegisterObserver(phone1)
89
+
weatherStation.RegisterObserver(phone2)
90
+
weatherStation.RegisterObserver(tv)
91
+
92
+
// Change temperature - all observers get notified
93
+
fmt.Println("Setting temperature to 25.5°C:")
94
+
weatherStation.SetTemperature(25.5)
95
+
96
+
fmt.Println("\nSetting temperature to 30.2°C:")
97
+
weatherStation.SetTemperature(30.2)
98
+
99
+
// Remove one observer
100
+
fmt.Println("\nRemoving Phone Display 2 and setting temperature to 28.0°C:")
101
+
weatherStation.RemoveObserver(phone2)
102
+
weatherStation.SetTemperature(28.0)
103
+
}
104
+
{{< /play >}}
105
+
106
+
در این پیادهسازی الگوی Observer، دو رابط اصلی Observer و Subject تعریف شدهاند. رابط Observer تنها متد Update را دارد که برای دریافت بهروزرسانیها از سوژه استفاده میشود. رابط Subject نیز متدهای RegisterObserver، RemoveObserver و NotifyObservers را برای مدیریت ناظرها تعریف میکند. کلاس WeatherStation به عنوان سوژهٔ بتن، این رابط را پیادهسازی کرده و دارای یک لیست از ناظرها است. وقتی دمای ایستگاه هواشناسی با متد SetTemperature تغییر میکند، متد NotifyObservers فراخوانی شده و تمام ناظرهای ثبتشده را با مقدار جدید دما به روز میکند. دو ناظر بتن PhoneDisplay و TVDisplay نیز رابط Observer را پیادهسازی کرده و هر کدام رفتار خاص خود را در متد Update تعریف میکنند. در تابع main، با ایجاد یک ایستگاه هواشناسی و چندین ناظر، نحوهٔ ثبت، حذف و اطلاعرسانی به ناظرها نمایش داده شده است.
Copy file name to clipboardExpand all lines: content/chapter 9/behavioral patterns/9.3.8-strategy.md
+148-1Lines changed: 148 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,4 +3,151 @@ title: '9.3.8 الگو Strategy'
3
3
slug: go-strategy-pattern
4
4
weight: 176008
5
5
---
6
-
الگو Strategy...
6
+
7
+
## 9.3.8.1 - توضیح الگوی Strategy
8
+
9
+
الگوی Strategy یک الگوی طراحی رفتاری است که به شما امکان میدهد یک خانواده از الگوریتمها را تعریف کرده، هر یک را در یک کلاس جداگانه کپسوله کنید و آنها را قابل تعویض کنید. این الگو اجازه میدهد الگوریتمها مستقل از کلاینتهایی که از آنها استفاده میکنند، تغییر کنند. با استفاده از این الگو، میتوانید رفتار یک کلاس را در زمان اجرا بدون تغییر ساختار آن کلاس تغییر دهید. Strategy وابستگی بین کلاینت و الگوریتمها را از بین برده و اصل "Open/Closed" را رعایت میکند، به طوری که میتوانید استراتژیهای جدیدی اضافه کنید بدون اینکه کد موجود را تغییر دهید.
در این پیادهسازی الگوی Strategy، رابط PaymentStrategy به عنوان استراتژی پایه تعریف شده که متد Pay را شامل میشود. چهار استراتژی بتن CreditCardPayment، PayPalPayment، CryptoPayment و BankTransferPayment این رابط را پیادهسازی کرده و هر کدام منطق پرداخت خاص خود را ارائه میدهند. کلاس PaymentProcessor به عنوان Context عمل میکند که یک استراتژی پرداخت را نگهداری کرده و با متد SetStrategy امکان تغییر استراتژی در زمان اجرا را فراهم میکند. متد ProcessPayment در Context، کار را به استراتژی فعلی واگذار میکند. همچنین یک تابع ساده به نام ProcessPayment به عنوان رویکرد جایگزین پیادهسازی شده است. در تابع main، استفاده از هر دو رویکرد (Context و تابع مستقیم) نمایش داده شده و نحوه تغییر پویای استراتژیها در زمان اجرا نشان داده شده است. همچنین سناریویی برای پرداختهای متعدد با استراتژیهای مختلف و مدیریت خطا برای زمانی که استراتژی تنظیم نشده، پیادهسازی شده است.
Copy file name to clipboardExpand all lines: content/chapter 9/creational patterns/9.1.2-factory-method.md
+119-1Lines changed: 119 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,4 +4,122 @@ slug: go-factory-method-pattern
4
4
weight: 172002
5
5
---
6
6
7
-
الگو Factory Method...
7
+
## 9.1.2.1 - توضیح الگوی Factory Method
8
+
9
+
الگوی Factory یک الگوی طراحی خلاقانه است که یک رابط برای ایجاد اشیا در یک سوپرکلاس فراهم میکند، اما اجازه میدهد زیرکلاسها نوع شیءی که ساخته میشود را تغییر دهند. این الگو با جدا کردن منطق ساخت اشیا از کلاینتهایی که از آن اشیا استفاده میکنند، وابستگی مستقیم بین کلاینت و کلاسهای بتن را از بین میبرد. الگوی Factory زمانی مفید است که یک کلاس نتواند پیشبینی کند چه نوع کلاسی باید ایجاد کند، یا زمانی که یک کلاس بخواهد مسئولیت ایجاد اشیا را به زیرکلاسها محول کند. این الگو با کپسولهسازی منطق ایجاد، نگهداری کد را آسانتر کرده و اصل "Open/Closed" را رعایت میکند.
در این پیادهسازی الگوی Factory، رابط Vehicle به عنوان محصول پایه تعریف شده که متدهای Drive و GetType را شامل میشود. سه کلاس بتن Car، Motorcycle و Truck این رابط را پیادهسازی کرده و هر کدام رفتار خاص خود را ارائه میدهند. کلاس VehicleFactory به عنوان فکتوری عمل میکند که با متد CreateVehicle بر اساس نوع وسیله نقلیه درخواستی، نمونه مناسب را ایجاد و بازمیگرداند. همچنین یک تابع فکتوری مستقل به نام CreateVehicle نیز پیادهسازی شده که همان عملکرد را بدون نیاز به ایجاد نمونه از فکتوری ارائه میدهد. در تابع main، استفاده از هر دو روش فکتوری (هم از طریق ساختار و هم تابع) نمایش داده شده و نحوه ایجاد انواع مختلف وسایل نقلیه بدون وابستگی مستقیم به کلاسهای بتن نشان داده شده است. همچنین مدیریت خطا برای نوعهای ناشناخته و نمایش چندشکلی (polymorphism) با استفاده از آرایهای از رابط Vehicle نیز پیادهسازی شده است.
0 commit comments