algorytm.org

Implementacja w C#

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Obserwator (observer) - Implementacja w C#
Ocena użytkownikóww: *****  / 3
SłabyŚwietny
Nadesłany przez Kamil Dworak, 10 sierpnia 2010 22:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

obserwator.cs:
/****************************************
*   Wzorzec Projektowy Observer         *
*   (obserwator)                        *   
*   www.algorytm.org                    *
*   Opracowal Dworak Kamil              *
*****************************************/

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Main
{
    interface Obserwowany
    {
        void dodajObserwatora(Obserwator o);
        void usunObserwatora(Obserwator o);
        void powiadamiajObserwatorow();
    }


    interface Obserwator
    {
        /* aktualizuje dane */
        void update(int[] wyniki);
    }


    interface Media
    {
        /* publikuje wyniki losowania */
        void informuj();
    }



    /* oberwowany obiekt */
    class TotoLotek : Obserwowany
    {
        private ArrayList obserwatorzy;
        private int[] wyniki;

        public TotoLotek()
        {
            obserwatorzy = new ArrayList();
            wyniki = new int[] { 0, 0, 0, 0, 0, 0 };
        }

        public void dodajObserwatora(Obserwator o)
        {
            obserwatorzy.Add(o);
        }

        public void usunObserwatora(Obserwator o)
        {
            int index = obserwatorzy.IndexOf(o);
            obserwatorzy.RemoveAt(index);
        }

        public void powiadamiajObserwatorow()
        {
            Obserwator[] tab = (Obserwator[])obserwatorzy.ToArray(typeof(Obserwator));
            for (int i = 0; i < tab.Length ; i++)
            {
                tab[i].update(wyniki);
            }
        }

        public void kolejneLosowanie()
        {
            int i = 0;
            Random random = new Random();
            while (i < 6)
            {
                bool powtorka = false;
                int x = random.Next(48);// (Math.random() * 47 - 1);
                for (int j = 0; j < 6; j++)
                {
                    if (wyniki[j] == x)
                    {
                        powtorka = true;
                    }
                }
                if (powtorka == false)
                {
                    wyniki[i++] = x;
                }
            }//while
            powiadamiajObserwatorow();
        }

        public int[] getResults()
        {
            return wyniki;
        }
    }//class

    /* obserwator */
    class Telewizja : Obserwator, Media
    {
        private int[] wyniki;
        private TotoLotek lotek;

        public Telewizja(TotoLotek lotek)
        {
            wyniki = new int[6];
            this.lotek = lotek;
        }

        public void update(int[] tab)
        {
            for (int i = 0; i < 6; i++)
            {
                wyniki[i] = tab[i];
            }
        }

        public void informuj()
        {
            Console.WriteLine("Dzisiejsze losowanie Totolotka by TVP");
            for (int i = 0; i < 6; i++)
                Console.Write(wyniki[i] + " ");
            Console.WriteLine();
        }

        public void spadam()
        {
            lotek.usunObserwatora(this);
        }
    }

    class Internet : Obserwator, Media
    {
        private int[] wyniki;
        private TotoLotek lotek;

        public Internet(TotoLotek lotek)
        {
            wyniki = new int[6];
            this.lotek = lotek;
        }

        public void update(int[] tab)
        {
            for (int i = 0; i < 6; i++)
            {
                wyniki[i] = tab[i];
            }
        }

        public void informuj()
        {
            Console.WriteLine("Wyniki TotoLotka na stronie internetowej");
            for (int i = 0; i < 6; i++)
                Console.Write(wyniki[i] + " ");
            Console.WriteLine();
        }

        public void spadam()
        {
            lotek.usunObserwatora(this);
        }
    }


    public class Obserwator
    {
        public static void Main(String[] args)
        {

            TotoLotek totoLotek = new TotoLotek();
            Telewizja telewizja = new Telewizja(totoLotek);
            Internet internet = new Internet(totoLotek);

            totoLotek.dodajObserwatora(telewizja);
            totoLotek.dodajObserwatora(internet);

            totoLotek.kolejneLosowanie();
            Console.WriteLine("LOSOWANIE 1\n");
            telewizja.informuj();
            internet.informuj();

            totoLotek.kolejneLosowanie();
            Console.WriteLine("\nLOSOWANIE 2\n");
            telewizja.informuj();
            internet.informuj();

            /* telewizja juz nie obserwuuje wynikow, nie bedzie miec aktualnych losowan */
            telewizja.spadam();
            totoLotek.kolejneLosowanie();
            Console.WriteLine("\nLOSOWANIE 3\n");
            telewizja.informuj();
            internet.informuj();
            String s = Console.ReadLine();
        }
    }
}
Komentarze
photo
-5 # Smaku 2011-04-20 09:35
cos chyba nie do konca...
"Error 1 The namespace 'Main' already contains a definition for 'Obserwator'...
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-3 # user 2013-01-06 14:00
Zmień nazwę klasy zawierającej metodę Main na cokolwiek, np. Testowa i będzie OK.
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-3 # Użytkownik 2014-05-07 17:51
Przyda się- wielkie dzięki! :)
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
0 # Johny Ive 2017-04-08 11:04
Dlaczego najpierw robisz ArrayList a później rzutujesz to na tablice? Nie lepiej od razu zrobić listę generyczną typu obserwator?
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz