1. ما هو نمط الوسيط
نمط الوسيط هو نمط تصميم سلوكي يقلل من التبعيات المباشرة بين الكائنات عن طريق نقل تواصلها إلى كائن وسيط. في نمط الوسيط، لا تتواصل الكائنات مباشرة مع بعضها البعض، بل من خلال كائن الوسيط.
2. سمات ومزايا نمط الوسيط
سمات ومزايا نمط الوسيط كما يلي:
- يقلل من التباعد المباشر بين الكائنات، مما يقلل من تعقيد النظام.
- يبسط التواصل بين الكائنات من خلال جعل كائن الوسيط يتعامل مع تواصلها.
- يركز التحكم بالتفاعلات بين الكائنات، مما ييسر إضافة المزايا والصيانة.
3. أمثلة حقيقية لنمط الوسيط
نمط الوسيط له العديد من التطبيقات في السيناريوهات الحقيقية. على سبيل المثال، في نظام جدولة المطار، يعمل الموزع كوسيط، في حين أن وحدات مختلفة مثل الطائرات وحركة الأرض تعمل كفئات زميلة تتواصل وتنسق من خلال الموزع.
4. تنفيذ نمط الوسيط في جو لانغ
4.1 مقدمة لرسم الفئات UML
فيما يلي مخطط الفئات UML لنمط الوسيط في جو لانغ:
4.2 مقدمة المثال
في هذا المثال، سنقوم بتنفيذ تطبيق بسيط لغرفة دردشة باستخدام نمط الوسيط لإدارة التواصل بين مستخدمين مختلفين.
4.3 تنفيذ الخطوة 1: تحديد واجهة الوسيط والوسيط الملم بالخرسانة
أولاً، نقوم بتحديد واجهة الوسيط وفئة الوسيط الملمة:
type Mediator interface {
registerColleague(colleague Colleague)
sendMessage(message string, colleague Colleague)
}
type ConcreteMediator struct {
colleagues map[string]Colleague
}
func (m *ConcreteMediator) registerColleague(colleague Colleague) {
m.colleagues[colleague.getName()] = colleague
}
func (m *ConcreteMediator) sendMessage(message string, colleague Colleague) {
for _, c := range m.colleagues {
if c != colleague {
c.receiveMessage(message)
}
}
}
4.4 تنفيذ الخطوة 2: تعريف واجهة الزميل وفئات الزميل الملمة
بعد ذلك، نقوم بتحديد واجهة الزميل وفئات الزميل الملمة:
type Colleague interface {
receiveMessage(message string)
sendMessage(message string)
getName() string
}
type ConcreteColleagueA struct {
mediator Mediator
name string
}
func (c *ConcreteColleagueA) receiveMessage(message string) {
fmt.Printf("%s received message: %s\n", c.name, message)
}
func (c *ConcreteColleagueA) sendMessage(message string) {
c.mediator.sendMessage(message, c)
}
func (c *ConcreteColleagueA) getName() string {
return c.name
}
type ConcreteColleagueB struct {
mediator Mediator
name string
}
func (c *ConcreteColleagueB) receiveMessage(message string) {
fmt.Printf("%s received message: %s\n", c.name, message)
}
func (c *ConcreteColleagueB) sendMessage(message string) {
c.mediator.sendMessage(message, c)
}
func (c *ConcreteColleagueB) getName() string {
return c.name
}
4.5 تنفيذ الخطوة 3: إدارة الزملاء في الوسيط
في فئة الوسيط المحددة، نحتاج إلى تنفيذ الطريقة 'registerColleague' والطريقة 'sendMessage' لإدارة التواصل بين فئات الزملاء:
func main() {
mediator := &ConcreteMediator{
colleagues: make(map[string]Colleague),
}
colleagueA := &ConcreteColleagueA{
mediator: mediator,
name: "Colleague A",
}
colleagueB := &ConcreteColleagueB{
mediator: mediator,
name: "Colleague B",
}
mediator.registerColleague(colleagueA)
mediator.registerColleague(colleagueB)
colleagueA.sendMessage("مرحباً يا عالم!")
colleagueB.sendMessage("مرحبًا هناك!")
}
في الدالة 'main'، نقوم بإنشاء كائن وسيط محدد واثنين من كائنات الزميل المحددة، ثم نسجل كائنات الزميل من خلال كائن الوسيط ونقوم بإجراء اختبارات التواصل.