1. چیستی الگوی واسط

الگوی واسط یک الگوی طراحی رفتاری است که با انتقال ارتباطات بین اشیاء به یک شی واسط، وابستگی‌های مستقیم بین اشیاء را کاهش می‌دهد. در الگوی واسط، اشیاء دیگر دیگر را مستقیماً ارتباط نمی‌دهند، بلکه از طریق شی واسط با یکدیگر ارتباط برقرار می‌کنند.

2. ویژگی‌ها و مزایای الگوی واسط

ویژگی‌ها و مزایا الگوی واسط به شرح زیر است:

  • کاهش اتصال مستقیم بین اشیاء که پیچیدگی سیستم را کاهش می‌دهد.
  • ساده‌سازی ارتباط بین اشیا با داشتن یک شی واسط برای مدیریت ارتباطات آن‌ها.
  • کنترل مرکزی بر تعاملات بین اشیاء که توسعه و نگهداری آن‌ها را آسان می‌کند.

3. نمونه‌های واقعی الگوی واسط

الگوی واسط در بسیاری از صورت‌های واقعی کاربرد دارد. به عنوان مثال، در یک سیستم برنامه‌ریزی فرودگاه، ارسال‌کننده به عنوان واسط عمل می‌کند، در حالی که ماژول‌های مختلف مانند هواپیماها و ترافیک زمینی به عنوان کلاس‌های همکار ارتباط برقرار کرده و هماهنگی از طریق ارسال‌کننده را دارند.

4. پیاده‌سازی الگوی واسط در Golang

4.1. معرفی نمودار کلاس UML

در زیر نمودار کلاس UML برای الگوی واسط در Golang آمده است:

الگوی واسط در Golang

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 پیام را دریافت کرد: %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 پیام را دریافت کرد: %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:     "همکار A",
    }
    colleagueB := &ConcreteColleagueB{
        mediator: mediator,
        name:     "همکار B",
    }

    mediator.registerColleague(colleagueA)
    mediator.registerColleague(colleagueB)

    colleagueA.sendMessage("سلام دنیا!")
    colleagueB.sendMessage("سلام!")
}

در تابع main، ما یک شی واسط خاص و دو شی همکار خاص را ایجاد می‌کنیم، سپس شی‌های همکار را از طریق شی واسط ثبت نام کرده و تست ارتباط را انجام می‌دهیم.