diff --git a/behavior/08_mediator/mediator.go b/behavior/08_mediator/mediator.go index 9797e75..8c122f3 100644 --- a/behavior/08_mediator/mediator.go +++ b/behavior/08_mediator/mediator.go @@ -18,52 +18,52 @@ type Person struct { //Tenant 租客 type Tenant struct { Person + m *mediator } //Landlord 房东,要收房租 type Landlord struct { Person accout int //房东的租金账户 + m *mediator } -//mediator 中介,比如某居客,某家,某壳,即代表租客跟房东谈条件,又代表房东对付租客 -//mediator 所以中介一定会持有两方的信息,最好用接口代表对象 -//mediator 这里简化一下,直接用类型的引用,表示拥有关系 -type mediator struct { - tenant *Tenant - landlord *Landlord - feeLandlord int //向房东收费的账户 - feeTenant int //向租客收费的账户 +//Mediator 中介,比如某居客,某家,某壳,即代表租客跟房东谈条件,又代表房东对付租客 +//Mediator 所以中介一定会持有两方的信息,最好用接口代表对象 +//Mediator 这里简化一下,假设中介只为一个房东和一个租客服务,直接用类型的引用,表示拥有关系 +type Mediator struct { + tenant interface{} + landlord interface{} + feelandlord int + feelandtenant int } //AskRepair 要求房东修家具 -func (c *tenant) AskRepair(furniture string) { - fmt.Printf("CDDriver: reading data %s\n", c.Data) - GetMediatorInstance().changed(c) +func (t *Tenant) AskRepair(furniture string) { + fmt.Println("i need landlord fix the:", furniture) + t.m.Changed() } //CollectRent 房东收租金了 -func (l *landlord) CollectRent(moneyCount int) { +func (l *Landlord) CollectRent(moneyCount int) { fmt.Printf("CPU: split data with Sound %s, Video %s\n", c.Sound, c.Video) - GetMediatorInstance().changed(c) } -var mediator *Mediator +//Changed 中介要提两边或者多边办事,所以它 +func (m *Mediator) Changed(i interface{}) { -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) - } +//PublishRoom 可以在中介这里发布房源 +func (m *Mediator) PublishRoom(landlord interface{}) { + + m.landlord = landlord + +} + +//RentRom 可以从中介租房子 +func (m *Mediator) RentRom(tenant interface{}) { + + m.tenant = tenant } diff --git a/behavior/08_mediator/mediator_test.go b/behavior/08_mediator/mediator_test.go index 1f8c78b..773c6a5 100644 --- a/behavior/08_mediator/mediator_test.go +++ b/behavior/08_mediator/mediator_test.go @@ -3,32 +3,13 @@ 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() + med := &mediator{} - if mediator.CD.Data != "music,image" { - t.Fatalf("CD unexpect data %s", mediator.CD.Data) - } + landlord := &Landlord{} - if mediator.CPU.Sound != "music" { - t.Fatalf("CPU unexpect sound data %s", mediator.CPU.Sound) - } + med.publishRoom(landlord) - if mediator.CPU.Video != "image" { - t.Fatalf("CPU unexpect video data %s", mediator.CPU.Video) - } + tenant := &Tenant{} - 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) - } }