OBSERVATEUR

using System;
using System.Collections.Generic;
 
namespace ObserverPatternDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Product Laptop = new Product("DELL", 1000);
            Console.WriteLine("--------Customer 1 and Customer 2 is subscribed to the Laptop Product----------");
            // attach or subscribe customer 1
            Customer Customer1 = new Customer("customer 1");
            Laptop.Subscribe(Customer1);
            // attach or subscribe customer 2
            Customer Customer2 = new Customer("customer 2");
            Laptop.Subscribe(Customer2);
            
            // publish notification to the subscribers
            Laptop.price = 800;
 
            Console.WriteLine("--------customer 2 is unsubscribed and customer 3 is subscribed to the Laptop Product----------");
            // customer 2 is unsubscribed and customer 3 is subscribed
            Laptop.Unsubscribe(Customer2);
            Customer Customer3 = new Customer("customer 3");
            Laptop.Subscribe(Customer3);
            Laptop.price = 900;
            Console.ReadLine();
        }
    }
    // ISubject Interface
    interface IProduct
    {
        // attach observer
        void Subscribe(Customer customer);
        // detach observer
        void Unsubscribe(Customer customer);
        // publish notification to the subscribers
        void Notify();
    }
    // ConcreteSubject class
    public class Product : IProduct
    {
        string name;
        float basePrice;
        float currentPrice;
        List<Customer> customers = new List<Customer>();
 
        public Product(string name, float basePrice)
        {
            this.name = name;
            this.basePrice = basePrice;
            this.currentPrice = basePrice;
        }
 
        public float price
        {
            get
            {
                return currentPrice;
            }
            set
            {
                // if price of the laptop will be less than the base price then 
                // notification will forwarded to the subscribers
                currentPrice = value;
                if (value <= basePrice)
                    Notify();
            }
        }
        public void Subscribe(Customer customer)
        {
            customers.Add(customer);
        }
 
        public void Unsubscribe(Customer customer)
        {
            customers.Remove(customer);
        }
 
        public void Notify()
        {
            foreach (Customer observer in customers)
            {
                observer.Update(this);
            }
        }
 
        public string Name
        {
            get { return name; }
        }
 
        public float discount
        {
            get { return (basePrice - currentPrice)*100/basePrice; }
        }
        public float CurrentPrice
        {
            get { return currentPrice; }
        }
    }
    // IObserver Interface
    interface ICustomer
    {
        void Update(Product product);
    }
    // ConcreteObserver Interface
    public class Customer : ICustomer
    {
        string name;
        public Customer(string name)
        {
            this.name = name;
        }
        public void Update(Product product)
        {
            Console.WriteLine("{0}: {1} Laptop is now available at {2}; Discount = {3}%",this.name, product.Name, product.CurrentPrice, product.discount);
        }
    }
 
    
}
Misty Manatee