1
0
Fork 0
design-patterns/go/observer/main.go

80 lines
1.6 KiB
Go

package main
import "fmt"
/*
实例:
汤宝宝一时想不开,当了房产中介。
一旦片区内有房东发布了新房源信息,他就会第一时间通知所有潜在租客。
*/
// 观察者抽象接口
type Observer interface {
Update()
}
// 目标抽象接口
type Subject interface {
Attach(observer Observer)
Detach(observer Observer)
Notify()
}
// 具体目标 - 房产中介
type HousingAgency struct {
observers []Observer
}
func (h *HousingAgency) Attach(observer Observer) {
h.observers = append(h.observers, observer)
}
func (h *HousingAgency) Detach(observer Observer) {
for i, obs := range h.observers {
if obs == observer {
h.observers = append(h.observers[:i], h.observers[i+1:]...)
break
}
}
}
func (h *HousingAgency) Notify() {
fmt.Println("房产中介通知了所有租客。")
for _, observer := range h.observers {
observer.Update()
}
}
// 具体观察者 - 租客
type Tenant struct {
name string
}
func (t *Tenant) Update() {
fmt.Printf("租客%s收到了房源更新通知。\n", t.name)
}
func main() {
fmt.Println("============= 观察者模式 =============")
agency := &HousingAgency{}
tenant1 := &Tenant{name: "小明"}
tenant2 := &Tenant{name: "小红"}
fmt.Println("小红和小明订阅了房产中介的房源信息。")
agency.Attach(tenant1)
agency.Attach(tenant2)
fmt.Println("房源上新了!")
agency.Notify()
fmt.Println("-----")
fmt.Println("小红不想再接收房源信息,退订了。")
agency.Detach(tenant2)
fmt.Println("又有新房源了!")
agency.Notify()
fmt.Println()
fmt.Println("=========== 观察者模式结束 ===========")
}