80 lines
1.6 KiB
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("=========== 观察者模式结束 ===========")
|
|
}
|