golang觀察者模式實(shí)現(xiàn)的代碼怎么寫

小億
72
2023-10-23 10:41:37
欄目: 編程語言

在Go語言中實(shí)現(xiàn)觀察者模式,可以按照以下步驟進(jìn)行:

  1. 定義主題(Subject)接口,包含以下方法:
type Subject interface {
    Register(observer Observer)    // 注冊(cè)觀察者
    Unregister(observer Observer)  // 取消注冊(cè)觀察者
    Notify()                       // 通知觀察者
}
  1. 定義觀察者(Observer)接口,包含以下方法:
type Observer interface {
    Update()  // 觀察者更新方法
}
  1. 實(shí)現(xiàn)主題(Subject)結(jié)構(gòu)體,同時(shí)實(shí)現(xiàn)Subject接口的方法:
type ConcreteSubject struct {
    observers []Observer
}

func (s *ConcreteSubject) Register(observer Observer) {
    s.observers = append(s.observers, observer)
}

func (s *ConcreteSubject) Unregister(observer Observer) {
    for i, o := range s.observers {
        if o == observer {
            s.observers = append(s.observers[:i], s.observers[i+1:]...)
            break
        }
    }
}

func (s *ConcreteSubject) Notify() {
    for _, observer := range s.observers {
        observer.Update()
    }
}
  1. 實(shí)現(xiàn)觀察者(Observer)結(jié)構(gòu)體,同時(shí)實(shí)現(xiàn)Observer接口的方法:
type ConcreteObserver struct {
    name string
}

func (o *ConcreteObserver) Update() {
    fmt.Println(o.name, "received notification")
}
  1. 使用觀察者模式:
func main() {
    subject := &ConcreteSubject{}

    observer1 := &ConcreteObserver{name: "Observer 1"}
    observer2 := &ConcreteObserver{name: "Observer 2"}

    subject.Register(observer1)
    subject.Register(observer2)

    subject.Notify()

    subject.Unregister(observer1)

    subject.Notify()
}

在上述代碼中,ConcreteSubject實(shí)現(xiàn)了Subject接口,ConcreteObserver實(shí)現(xiàn)了Observer接口。當(dāng)Subject的狀態(tài)發(fā)生變化時(shí),通過調(diào)用Notify方法通知所有注冊(cè)的觀察者進(jìn)行更新。在main函數(shù)中,我們創(chuàng)建了一個(gè)ConcreteSubject對(duì)象,并注冊(cè)了兩個(gè)ConcreteObserver對(duì)象。然后通過調(diào)用Notify方法通知所有觀察者進(jìn)行更新。最后,我們?nèi)∠?cè)了observer1,并再次調(diào)用Notify方法,此時(shí)只有observer2會(huì)收到通知。

0