观察者模式(Observer)/依赖(Dependents)/发布-订阅(Publish-Subscribe)
1.意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
2.适用性
在以下任一情况下可以使用观察者模式 :
- 当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
- 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
- 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。
3.结构
4.代码
package observer
import (
"fmt"
"testing"
)
/*
# 观察者模式
观察者模式用于触发联动。
一个对象的改变会触发其它观察者的相关动作,而此对象无需关心连动对象的具体实现。
*/
//短信验证和用户
// 报社 —— 客户
type Customer interface {
update()
}
type CustomerA struct {
}
func (*CustomerA) update() {
fmt.Println("我是客户A, 我收到报纸了")
}
type CustomerB struct {
}
func (*CustomerB) update() {
fmt.Println("我是客户B, 我收到报纸了")
}
// 报社 (被观察者)
type NewsOffice struct {
customers []Customer
}
func (n *NewsOffice) addCustomer(customer Customer) {
n.customers = append(n.customers, customer)
}
func (n *NewsOffice) newspaperCome() {
// 通知所有客户
n.notifyAllCustomer()
}
func (n *NewsOffice) notifyAllCustomer() {
for _, customer := range n.customers {
customer.update()
}
}
func TestObserver(t *testing.T) {
customerA := &CustomerA{}
customerB := &CustomerB{}
office := &NewsOffice{}
// 模拟客户订阅
office.addCustomer(customerA)
office.addCustomer(customerB)
// 新的报纸
office.newspaperCome()
}