Maison >développement back-end >Golang >Comment les canaux peuvent-ils être utilisés pour implémenter le modèle d'observateur dans Go ?

Comment les canaux peuvent-ils être utilisés pour implémenter le modèle d'observateur dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-06 05:01:02982parcourir

How Can Channels Be Used to Implement the Observer Pattern in Go?

Implémentation en langage Go du modèle Observer

Le modèle Observer implique un objet Publisher notifiant ses observateurs abonnés lors de l'apparition d'un événement spécifique. Le langage Go offre un moyen simple d'implémenter ce modèle à l'aide de canaux.

Pour comprendre comment cela fonctionne, considérons un scénario dans lequel plusieurs objets s'abonnent à un éditeur. L'éditeur peut ensuite diffuser des notifications à tous les abonnés via les canaux.

Voici un exemple de code Go qui illustre le modèle Observer :

package main

import "fmt"

// Publisher is an object that can notify subscribers of an event.
type Publisher struct {
    listeners []chan string
}

// Subscriber represents an object that can receive notifications from a Publisher.
type Subscriber struct {
    ID       int
    Channel  chan string
}

// Sub adds a Subscriber to the Publisher's list of listeners.
func (p *Publisher) Sub(sub *Subscriber) {
    p.listeners = append(p.listeners, sub.Channel)
}

// Pub sends a notification to the Publisher's subscribers.
func (p *Publisher) Pub(msg string) {
    for _, c := range p.listeners {
        c <- msg
    }
}

// Run starts a Subscriber listening for notifications from the Publisher.
func (s *Subscriber) Run() {
    for {
        msg := <-s.Channel
        fmt.Printf("Subscriber %d received: %s\n", s.ID, msg)
    }
}

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

    // Create and add Subscribers
    for i := 0; i < 3; i++ {
        subscriber := &Subscriber{ID: i, Channel: make(chan string)}
        publisher.Sub(subscriber)
        go subscriber.Run()
    }

    // Send notifications
    publisher.Pub("Hello 1")
    publisher.Pub("Hello 2")
    publisher.Pub("Hello 3")
}

Dans cet exemple, l'éditeur (éditeur) a une liste des chaînes (auditeurs) sur lesquelles il diffuse des notifications. Les abonnés (Subscriber) disposent de leurs propres chaînes (Channel) pour recevoir des notifications. Lorsque l'éditeur envoie une notification (Pub), il l'envoie à tous les abonnés via leurs canaux. Chaque abonné imprime ensuite la notification reçue. Cela démontre comment l'éditeur peut diffuser des mises à jour à ses observateurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn