[ Valerij Zajcev @ 25.05.2010. 16:05 ] @
Da li Subject uvek mora da ima instance svojih observer-a u sebi?
Vezano za .NET, da li je observer u sustini ista stvar kao delegat u .NET-u i da li je u primeru kako sam ga ja sastvaio dole "Update()" u stvari ta Callback metoda?
Primer kako ja mislim da se radi sa observerom:
Code (csharp):

public partial class frmSubject : Form, ISubject
    {        
        public List<IObserver> ObserversList = new List<IObserver>();

        public frmSubject()
        {
            InitializeComponent();
            RegisterObserver(new frmObserver());
        }

        private void btnNotify_Click(object sender, EventArgs e)
        {
            NotifyObservers();
        }        

        public void RegisterObserver(IObserver observer)
        {
            if (observer is IObserver)
            {
                ObserversList.Add(observer);
            }
        }

        public void RemoveObserver(IObserver observer)
        {
            if (observer is IObserver)
            {
                ObserversList.Remove(observer);
            }
        }

        public void NotifyObservers()
        {
            foreach (IObserver io in ObserversList)
            {
                io.Update("Clicked");
            }
        }      
    }
 


Code (csharp):

public partial class frmObserver : Form, IObserver
    {
        public frmObserver()
        {
            InitializeComponent();
            this.Show();
        }              

        public void Update(string msg)
        {            
            lstEmployee.Items.Add(msg);
            lstManager.Items.Add(msg);
        }
    }
 


[Ovu poruku je menjao Shadowed dana 25.05.2010. u 17:44 GMT+1]
[ mmix @ 25.05.2010. 16:24 ] @
Sustinski, u lokalu da (u principu MulticastEvent je subject, delegat je observer), mada observer patern moze da bude mnogo vise od toga jer ne mora da bude ogranicen na aplikacioni domen. Mozes sa njim komotno da napravis neki distributed event sistem.
Pogledaj ovde za vise detalja: http://msdn.microsoft.com/en-us/library/ee817669.aspx


(i btw, ne treba ti "is" provera u register/remove, strong typed jezik kako c# blokira neispravne parametre pri kompajliranju)
[ Mihajlo Cvetanović @ 25.05.2010. 16:30 ] @
Ako sam ja to dobro skontao delegati su napravljeni po uzoru na observer šablon, ali ti ne moraš da koristiš delegate da bi napravio svoju implementaciju observer šablona. Ja ne koristim šablone u radu u smislu da dok programiram kažem sebi ovde ću da upotrebim ovaj šablon, a onde onaj. Koristim ih u smislu da napravim programersko rešenje, za koje se ispostavlja da je neko prozvao u šablon i dao mu ime. Ne treba se opterećivati mnogo šablonima. Mada, neke moje kolege se lože na njih, i umeju da ih koriste.
[ mmix @ 25.05.2010. 18:49 ] @
Vidim da ti u stvari i nisam odgovorio na prvo pitanje, odgovor je da, subject mora da ima instance obzervera da implementirao pattern.

Sad mi je pala na pamet jos jedna razlika izmedju .net eventa i observer paterna. .NET event/delegate sistem je uvezan direktno 1-1, tj event implementira subject za samo jednu poruku. U custom implementaciji nisi ogranicen na samo jednu poruku, tj IObserver moze da implementira vise metoda (npr Update, Reset, itd) i subject moze da ima vise notify kanala. Iako nije bas "koser" po specifikaciji, moguce je (sa eventom nije). U COMu je source/sink je bio direktna fabricka implementacija observer paterna (source je subject, sink je observer) koja je "fabricki" podrzana kroz IConnectionPoint i IConnectionPointContainer interfejse (koje source tj subject mora da implementira).
[ Valerij Zajcev @ 25.05.2010. 20:29 ] @
Hvala, msdn clanak je odlican. A ovo sto se tice callback metode to je u stvari metoda u observer-u odnosno u .NET-u metoda koja hendla event jel da?
[ mmix @ 25.05.2010. 20:33 ] @
da
[ wex-alpha @ 06.06.2010. 23:09 ] @
Odlican clanal mmix. Hvala.