Programmering

Implementering af Observer-designmønsteret i C #

Observer-designmønsteret falder ind under kategorien Behavioral design mønster og bruges, når du vil give besked om ændring til et antal klasser. Adfærdsmønstre er mønstre, der bruges til at håndtere objektsamarbejde og delegering af ansvar.

I det væsentlige bruges Observer-designmønsteret til at definere, hvordan kommunikation mellem komponenter i en applikation interagerer med hinanden eller underretter hinanden ved at sende meddelelser. I dette mønster opretholder emnet en liste over observatørerne og underretter derefter disse observatører eller de afhængige, når og når en statsændring sker. Du kan også tilføje eller fjerne observatører under kørsel.

Anvendelighed

Hvornår skal du bruge dette designmønster? Det er et godt valg, når du gerne vil have et emne, der skal observeres af en eller flere observatører. Det er et populært designmønster, der hjælper dig med at implementere et udgiver / abonnentscenario, hvor ændringer i et objekts tilstand kan meddeles til alle afhængige objekter eller abonnenter (i en typisk implementering af udgiver / abonnentscenariet). I Observer-designmønsteret kommunikeres tilstandsændringerne for et objekt til et andet objekt uden behovet for, at objekterne er tæt koblet med hinanden.

MVC (Model View Component) arkitektonisk mønster er et klassisk eksempel på implementering af Observer design mønster. MVC-arkitektoniske mønster bruges til at opbygge applikationer, der er løst koblede, lettere at teste og vedligeholde. I en typisk MVC-implementering afkobles visningen og modellen fra hinanden. Mens visningen repræsenterer observatøren, repræsenterer modellen dit observerbare objekt.

Implementering af Observer-designmønsteret

Vi har fået nok af koncepterne - lad os nu forstå dette designmønster med en implementering. Først skal vi kende de deltagende klasser eller typer.

  • Emne: Dette er repræsenteret af en type, der bruges til at definere en grænseflade til at vedhæfte eller løsne en eller flere observatører
  • Beton Emne: Dette bruges til at underrette observatører, når der sker en ændring af staten
  • Observatør: Dette repræsenterer den type, der skal underrettes, når der sker en ændring
  • ConcreteObserver: Dette repræsenterer den konkrete implementering af observatørtypen

I en typisk implementering af Observer-designmønsteret vil du muligvis have en emnetype og en observatortype. Her er et kodestykke, der illustrerer dette.

offentlig abstrakt klasse Emne

    {

beskyttet liste lstObservers = ny liste ();

beskyttet ugyldigt register (observatør observatør)

        {

lstObservers.Add (observatør);

        }

beskyttet ugyldigt UnRegister (observatør observatør)

        {

lstObservers.Remove (observatør);

        }

beskyttet ugyldigt UnRegisterAll ()

        {

foreach (observatør observatør i lstObservers)

            {

lstObservers.Remove (observatør);

            }

        }

offentlig abstrakt ugyldig Notify ();

    }

offentlig abstrakt klasse Observer

    {

offentlig abstrakt ugyldig opdatering ();

    }

Se nu kodeuddraget ovenfor. Emneklassen indeholder en liste over Observer-forekomster og et par metoder til at tilføje eller fjerne abonnenterne, dvs. forekomster af Observer-klassen. Bemærk, at Notify-metoden er erklæret abstrakt - den klasse, der vil udvide emneklassen, skal levere den respektive implementering til denne metode. Observerklassen indeholder kun en metode - Opdateringsmetoden. Jeg har gjort denne implementering så enkel som muligt.

BlogPost-klassen udvider emneklassen og implementerer Notify-metoden, der er blevet erklæret som abstrakt i emneklassen.

public class BlogPost: Emne

    {

public void Attach (Observer observer)

        {

// Du kan skrive din egen implementering her eller ringe til basisversionen

base.Register (observatør);

        }

public void Detach (Observer observator)

        {

// Du kan skrive din egen implementering her eller ringe til basisversionen

base.UnRegister (observatør);

        }

offentlig ugyldighed DetachAll ()

        {

// Du kan skrive din egen implementering her eller ringe til basisversionen

base.UnRegisterAll ();

        }

offentlig tilsidesættelse ugyldig Underret ()

        {

foreach (observatør observatør i lstObservers)

            {

observatør.Opdatering ();

            }

        }

    }

Klassen ConcreteObserver er angivet nedenfor. Jeg overlader til læserne at skrive deres egen kode i opdateringsmetoden for at sende en e-mail med besked om, at en artikel er blevet sendt, osv.

offentlig klasse ConcreteObserver: Observer

    {

offentlig streng E-mail

        {

få; sæt;

        }

offentlig tilsidesættelse ugyldig opdatering ()

        {

Console.WriteLine ("Inde i opdateringsmetoden ...");

        }

    }

Du kan lære mere om Observer-designmønsteret fra dette link.