美文网首页
中介者模式

中介者模式

作者: 小幸运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