首页
读书
网课

正文

中介者模式封装对象之间互交,使依赖变的简单,并且使复杂互交简单化,封装在中介者中。


例子中的中介者使用单例模式生成中介者。


中介者的change使用switch判断类型。


mediator.go

package mediator


import (

    "fmt"

    "strings"

)


type CDDriver struct {

    Data string

}


func (c *CDDriver) ReadData() {

    c.Data = "music,image"


    fmt.Printf("CDDriver: reading data %s\n", c.Data)

    GetMediatorInstance().changed(c)

}


type CPU struct {

    Video string

    Sound string

}


func (c *CPU) Process(data string) {

    sp := strings.Split(data, ",")

    c.Sound = sp[0]

    c.Video = sp[1]


    fmt.Printf("CPU: split data with Sound %s, Video %s\n", c.Sound, c.Video)

    GetMediatorInstance().changed(c)

}


type VideoCard struct {

    Data string

}


func (v *VideoCard) Display(data string) {

    v.Data = data

    fmt.Printf("VideoCard: display %s\n", v.Data)

    GetMediatorInstance().changed(v)

}


type SoundCard struct {

    Data string

}


func (s *SoundCard) Play(data string) {

    s.Data = data

    fmt.Printf("SoundCard: play %s\n", s.Data)

    GetMediatorInstance().changed(s)

}


type Mediator struct {

    CD    *CDDriver

    CPU   *CPU

    Video *VideoCard

    Sound *SoundCard

}


var mediator *Mediator


func GetMediatorInstance() *Mediator {

    if mediator == nil {

        mediator = &Mediator{}

    }

    return mediator

}


func (m *Mediator) changed(i interface{}) {

    switch inst := i.(type) {

    case *CDDriver:

        m.CPU.Process(inst.Data)

    case *CPU:

        m.Sound.Play(inst.Sound)

        m.Video.Display(inst.Video)

    }

}

mediator_test.go

package mediator


import "testing"


func TestMediator(t *testing.T) {

    mediator := GetMediatorInstance()

    mediator.CD = &CDDriver{}

    mediator.CPU = &CPU{}

    mediator.Video = &VideoCard{}

    mediator.Sound = &SoundCard{}


    //Tiggle

    mediator.CD.ReadData()


    if mediator.CD.Data != "music,image" {

        t.Fatalf("CD unexpect data %s", mediator.CD.Data)

    }


    if mediator.CPU.Sound != "music" {

        t.Fatalf("CPU unexpect sound data %s", mediator.CPU.Sound)

    }


    if mediator.CPU.Video != "image" {

        t.Fatalf("CPU unexpect video data %s", mediator.CPU.Video)

    }


    if mediator.Video.Data != "image" {

        t.Fatalf("VidoeCard unexpect data %s", mediator.Video.Data)

    }


    if mediator.Sound.Data != "music" {

        t.Fatalf("SoundCard unexpect data %s", mediator.Sound.Data)

    }

}



上一篇: 没有了
下一篇: 没有了
圣贤书院