Implement Observer Design Pattern in C# - Real World Example Brokers watching company Share Price

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

namespace ShareManager
{
    abstract class Shares
    {
        private string _companysymbol;
        private double _shareprice;
        private List<ShareHolder> _shareholders = new List<ShareHolder>();

        public Shares(string companysymbol, double shareprice)
        {
            this._companysymbol = companysymbol;
            this._shareprice = shareprice;
        }

        public void Watch(ShareHolder shareholder)
        {
            _shareholders.Add(shareholder);
        }

        public void Detach(ShareHolder shareholder)
        {
            _shareholders.Remove(shareholder);
        }

        public void Notify()
        {
            foreach (ShareHolder shareholder in _shareholders)
            {
                shareholder.Update(this);
            }

            Console.WriteLine("");
        }

        public double SharePrice
        {
            get { return _shareprice; }
            set
            {
                if (_shareprice != value)
                {
                    _shareprice = value;
                    Notify();
                }
            }
        }

        // Gets the companysymbol
        public string CompanySymbol
        {
            get { return _companysymbol; }
        }
    }

    class CompanyShare : Shares
    {
        public CompanyShare(string companysymbol, double shareprice)
            : base(companysymbol, shareprice)
        {
        }
    }

    interface ShareHolder
    {
        void Update(Shares companysharevalue);
    }

    class Broker : ShareHolder
    {
        private string _name;

        public Broker(string name)
        {
            this._name = name;
        }

        public void Update(Shares companysharevalue)
        {
            Console.WriteLine("Notified broker {0} of {1}'s share price" +
              " change to £{2:F}", _name, companysharevalue.CompanySymbol, companysharevalue.SharePrice);
        }

    }

    class ShareManager
    {
        static void Main()
        {
            CompanyShare _kg = new CompanyShare("Kerry Group", 26.00);
            _kg.Watch(new Broker("Davys"));
            _kg.Watch(new Broker("Goodbodys"));
            _kg.Watch(new Broker("NCB"));

            CompanyShare _aib = new CompanyShare("AIB", 0.55);
            _aib.Watch(new Broker("Davys"));
            _aib.Watch(new Broker("Goodbodys"));
            _aib.Watch(new Broker("NCB"));

            _kg.SharePrice = 26.10;
            _kg.SharePrice = 26.30;
            _aib.SharePrice = 00.52;
            _kg.SharePrice = 26.75;

            Console.ReadKey();
        }
    }
}

Comments

Post a Comment

Popular posts from this blog

Basic Send Message to MQ with Java and IBM MQ JMS

Basic Receive Message to MQ with Java and IBM MQ JMS

Configure Database Connection using MyBatis