Bagaimanakah saluran Go boleh digunakan untuk melaksanakan Corak Pemerhati?

DDD
Lepaskan: 2024-11-05 11:01:02
asal
984 orang telah melayarinya

How can Go channels be used to implement the Observer Pattern?

Corak Pemerhati dalam Bahasa Go

Dalam banyak senario pengaturcaraan, keperluan timbul apabila objek mesti memberitahu berbilang pelanggan apabila kejadian berlaku. Corak ini biasanya dikenali sebagai Corak Pemerhati. Dalam Go, saluran menyediakan penyelesaian yang elegan untuk melaksanakan corak ini.

Sampel kod di bawah menunjukkan contoh yang berfungsi:

<code class="go">type Publisher struct {
    listeners []chan *Msg
}

type Subscriber struct {
    Channel chan *Msg
}

func (p *Publisher) Sub(c chan *Msg) {
    p.appendListener(c)
}

func (p *Publisher) Pub(m *Msg) {
    for _, c := range p.listeners {
        c <- Msg
    }
}

func (s *Subscriber) ListenOnChannel() {
    for {
        data := <-s.Channel
        // Process data
    }
}

func main() {
    publisher := &Publisher{}

    subscribers := []*Subscriber{
        &Subscriber{make(chan *Msg)},
        &Subscriber{make(chan *Msg)},
        // Additional subscribers can be added here
    }

    for _, sub := range subscribers {
        publisher.Sub(sub.Channel)
        go sub.ListenOnChannel()
    }

    publisher.Pub(&Msg{"Event Notification"})

    // Pause the main function to allow subscribers to process messages
    time.Sleep(time.Second)
}

type Msg struct {
    Message string
}</code>
Salin selepas log masuk

Dalam contoh ini, Penerbit memegang sepotong saluran pendengar, yang mewakili objek yang dilanggan. Kaedah Pub memberitahu semua pendengar dengan menghantar data ke saluran mereka. Setiap Pelanggan mendengar secara berterusan pada saluran khusus untuk data masuk untuk diproses.

Atas ialah kandungan terperinci Bagaimanakah saluran Go boleh digunakan untuk melaksanakan Corak Pemerhati?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!