美文网首页
中介者模式

中介者模式

作者: 小幸运Q | 来源:发表于2021-02-21 09:08 被阅读0次

中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持送耦合,使代码易于维护。

例如,中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

缺点:中介者会庞大,变得复杂难以维护。

适用场景:

(1)系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
(2)交互的公共行为,如果需要改变行为,则可以增加新的中介者类。

image.png

(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")
}

相关文章

网友评论

      本文标题:中介者模式

      本文链接:https://www.haomeiwen.com/subject/hxcbxltx.html