Thursday, May 10, 2012

Simple Observer Pattern


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

namespace Observer
{
    class Program
    {
        static void Main(string[] args)
        {
            // Configure Observer pattern
            Subject s = new Subject();

            s.Attach(new Observer(s, "X"));
            s.Attach(new Observer(s, "Y"));
            s.Attach(new Observer(s, "Z"));

            // Change subject and notify observers
            s.SubjectState = "ABC";
            s.Notify();

            // Wait for user
            Console.Read();
        }
    }

    // "Subject"
    class Subject
    {
        public string SubjectState;

        private ArrayList observers = new ArrayList();

        public void Attach(Observer observer)
        {
            observers.Add(observer);
        }

        public void Detach(Observer observer)
        {
            observers.Remove(observer);
        }

        public void Notify()
        {
            foreach (Observer o in observers)
            {
                o.Update();
            }
        }
    }


    // "Observer"
    class Observer
    {
        private string name;
        private string observerState;
        private Subject subject;

        // Constructor
        public Observer(Subject subject, string name)
        {
            this.subject = subject;
            this.name = name;
        }

        public void Update()
        {
            observerState = subject.SubjectState;
            Console.WriteLine("Observer {0}'s new state is {1}", name, observerState);
        }
    }
}

No comments:

Post a Comment