Go 18.0 专业五


03. 中介者模式

<p>中介者模式封装对象之间互交,使依赖变的简单,并且使复杂互交简单化,封装在中介者中。</p> <p>例子中的中介者使用单例模式生成中介者。</p> <p>中介者的change使用switch判断类型。</p> <h4>mediator.go</h4> <pre><code>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 = &amp;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) } }</code></pre> <h4>mediator_test.go</h4> <pre><code>package mediator import "testing" func TestMediator(t *testing.T) { mediator := GetMediatorInstance() mediator.CD = &amp;CDDriver{} mediator.CPU = &amp;CPU{} mediator.Video = &amp;VideoCard{} mediator.Sound = &amp;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) } }</code></pre>

页面列表

ITEM_HTML