????????2??“???????????÷????????”

????????????????????????“???????”?????????????????“??”??“????”???????????????д????“???????”?е?С??????????????????????????????????÷??????????

????[?????????"??????"???????]

/// <summary>
    /// ?????з???????????
    /// </summary>
    public class DelegateSubject
    {
        //??ж???
        public delegate void NotifyEventHandler(string msg);
        //?????????????????????????????
        public NotifyEventHandler NotifyObservers = null;

        //???????????????
        public string SubjectName { get; set; }
        //?????????
        public string Message { get; set; }

        //???????? 
        public DelegateSubject(string subjectName)
        {
            SubjectName = subjectName;
        }

        //?????з??????????ù?????????????????
        public void Notify()
        {
            NotifyEventHandler tempNotifyHander = NotifyObservers;
            if (tempNotifyHander != null)
            {
?????????????????? //???????????÷????????????
                tempNotifyHander(Message);
            }
        }
    }

????[?????????"???????"???????]

/// <summary>
    /// ????????
    /// </summary>
    public class ConcreteObserver : IObserver
    {
        //?????????????У?????
        public string ObserverName { get; set; }
        //???????????????
        string[] weather = { "????"?? "????"??"????" };
     
        //???????????
        public ConcreteObserver(string observerName)
        {
            ObserverName = observerName;
        }

        //?????????????????
        public void NewMessage(string msg)
        {
            if (weather.Contains(msg))  //???????????????
            {
                Console.WriteLine(ObserverName + "???????:" + msg);
                Thread.Sleep(2000);
                Console.WriteLine(ObserverName + "???????????????2s");
            }
            else                        //???????????...
            {
                Console.WriteLine(ObserverName + "???????:" + msg);
                Console.WriteLine(ObserverName + "????????????????????????????????...");
                throw new Exception(ObserverName + "??????" + msg + "????????");
            }
        }
    }

????[??????????]

private static void TestDelegateObserverPattern()
        {
            try
            {
                DelegateSubject subject_Weather = new DelegateSubject("????");

                IObserver observer_School = new ConcreteObserver("?У");
                IObserver observer_Company = new ConcreteObserver("???");

                subject_Weather.NotifyObservers += observer_School.NewMessage;
                subject_Weather.NotifyObservers += observer_Company.NewMessage;

                subject_Weather.Message = "????";
                subject_Weather.Notify();

                Console.WriteLine();

                subject_Weather.Message = "??";
                subject_Weather.Notify();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }