中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持送耦合,使代码易于维护。
例如,中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。
优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
缺点:中介者会庞大,变得复杂难以维护。
适用场景:
(1)系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
(2)交互的公共行为,如果需要改变行为,则可以增加新的中介者类。
(1)IMediator:抽象中介者,它定义了对象之间交流的方法。就好比国与国之间的沟通方式。
(2)ConcreteMediator:具体中介者,联合国的正式组成运营。
(3)IColleague:抽象同事类,就好比是一个抽象的国家模型。里面定义了一些功能。
(4) ConcreteColleague: 具体同事类。就好比是一个个具体的国家,英国、美国。
image.png代码示例(有些时候会把mediator作为Colleague成员变量有时候简单处理只创建临时变量)
每个国家都有SendMsg方法给对方,但是SendMsg需要借助每个国家的mediator中介的commuicate方法调用对方国家的receive方法,而mediator中介里面又有对应的国家对象。
package main
import (
"fmt"
)
type IMediator interface {
Communicate(string, ICountry)
}
type Mediator struct {
cn ChinaCountry
us AmericaCountry
}
func (m *Mediator) Communicate(msg string, country ICountry) {
// 中国发msg米国收,否则相反
if country.GetName() == "China" {
m.us.ReceiveMessage(msg)
} else {
m.cn.ReceiveMessage(msg)
}
}
type ICountry interface {
Country(string, IMediator)
GetName() string
SendMessage(string)
ReceiveMessage(string)
}
type ChinaCountry struct {
ICountry
CountryName string
mediator IMediator
}
func (i *ChinaCountry) Country(name string, mediator IMediator) {
i.mediator = mediator
i.CountryName = name
}
func (i *ChinaCountry) GetName() string {
return i.CountryName
}
func (i *ChinaCountry) SendMessage(msg string) {
i.mediator.Communicate(msg, i)
}
func (i *ChinaCountry) ReceiveMessage(msg string) {
fmt.Println("cn received.")
}
type AmericaCountry struct {
ICountry
CountryName string
mediator IMediator
}
func (i *AmericaCountry) Country(name string, mediator IMediator) {
i.mediator = mediator
i.CountryName = name
}
func (i *AmericaCountry) GetName() string {
return i.CountryName
}
func (i *AmericaCountry) SendMessage(msg string) {
i.mediator.Communicate(msg, i)
}
func (i *AmericaCountry) ReceiveMessage(msg string) {
fmt.Println("cn received.")
}
func main() {
//定义的时候,接口实现的是指针接收,所以用指针初始化
m := new(Mediator)
cn := new(ChinaCountry)
us := new(AmericaCountry)
cn.Country("China", m)
us.Country("America", m)
cn.SendMessage("Hello")
}
网友评论