1. Mediator Pattern là gì
Mẫu Mediator là một mẫu thiết kế hành vi giảm thiểu sự phụ thuộc trực tiếp giữa các đối tượng bằng cách chuyển giao thông của họ cho một đối tượng trung gian. Trong mô hình Mediator, các đối tượng không còn giao tiếp trực tiếp với nhau, mà thay vào đó thông qua đối tượng trung gian.
2. Đặc điểm và Ưu điểm của Mẫu Mediator
Các đặc điểm và ưu điểm của Mẫu Mediator như sau:
- Giảm sự liên kết trực tiếp giữa các đối tượng, giảm độ phức tạp của hệ thống.
- Đơn giản hóa quá trình giao tiếp giữa các đối tượng bằng cách có một đối tượng trung gian xử lý giao tiếp của họ.
- Tập trung kiểm soát các tương tác giữa các đối tượng, tạo điều kiện cho việc mở rộng và bảo trì.
3. Ví dụ về Mẫu Mediator trong thực tế
Mẫu Mediator có nhiều ứng dụng trong các tình huống thực tế. Ví dụ, trong một hệ thống lập kế hoạch sân bay, người điều phối đóng vai trò là trung gian, trong khi các module khác như máy bay và giao thông mặt đất phục vụ như các lớp đồng nghiệp, giao tiếp và phối hợp thông qua người điều phối.
4. Triển khai Mẫu Mediator trong Golang
4.1. Giới thiệu về Biểu đồ lớp UML
Dưới đây là biểu đồ lớp UML cho Mẫu Mediator trong Golang:
4.2. Giới thiệu ví dụ
Trong ví dụ này, chúng ta sẽ triển khai một ứng dụng phòng chat đơn giản bằng cách sử dụng Mẫu Mediator để quản lý giao tiếp giữa các người dùng khác nhau.
4.3. Bước triển khai 1: Định nghĩa Giao diện và Trung gian Cụ thể
Đầu tiên, chúng ta định nghĩa một giao diện trung gian và một lớp trung gian cụ thể:
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. Bước triển khai 2: Định nghĩa Giao diện và Lớp đồng nghiệp Cụ thể
Tiếp theo, chúng ta định nghĩa một giao diện đồng nghiệp và các lớp đồng nghiệp cụ thể:
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 nhận được tin nhắn: %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 nhận được tin nhắn: %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. Bước triển khai 3: Quản lý Đồng nghiệp trong Trung gian
Trong lớp trung gian cụ thể, chúng ta cần triển khai phương thức registerColleague
và phương thức sendMessage
để quản lý giao tiếp giữa các lớp đồng nghiệp:
func main() {
mediator := &ConcreteMediator{
colleagues: make(map[string]Colleague),
}
colleagueA := &ConcreteColleagueA{
mediator: mediator,
name: "Đồng nghiệp A",
}
colleagueB := &ConcreteColleagueB{
mediator: mediator,
name: "Đồng nghiệp B",
}
mediator.registerColleague(colleagueA)
mediator.registerColleague(colleagueB)
colleagueA.sendMessage("Xin chào, Thế giới!")
colleagueB.sendMessage("Chào bạn!")
}
Trong hàm main
, chúng ta tạo một đối tượng trung gian cụ thể và hai đối tượng đồng nghiệp cụ thể, sau đó đăng ký các đối tượng đồng nghiệp thông qua đối tượng trung gian và thực hiện kiểm tra giao tiếp.