观察者模式

//Main方法,测试方法运行正常
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ObserverClock
{
    class Program
    {
        static void Main(string[] args)
        {
            UtcTime utcTime = new UtcTime();
            utcTime.attach("北京", new CityClock(8));
            utcTime.attach("伦敦", new CityClock(0));
            utcTime.attach("墨西哥", new CityClock(4));
            utcTime.attach("悉尼", new CityClock(10));
            utcTime.attach("纽约", new CityClock(-5));
            PhoneClock phoneClock = new PhoneClock(8);
            phoneClock.setUtcTime(utcTime);
            phoneClock.setLocalTime(9);
            utcTime.showAllClocks();
            Console.ReadLine();
        }
    }
}

//UtcTime,用于设置时区时间和显示时区时间
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ObserverClock
{
    public class UtcTime : TimeSubject
    {
        private int uctZeroTime;
       
        public int UctZeroTime
        {
            get { return uctZeroTime; }
            set { 
                uctZeroTime = value;
                notifyAllClocks();
            }
        }
      
        

        public override void notifyAllClocks()
        {
            foreach (Clock clock in base.clocks.Values)
            {
                clock.setLocalTimeFromUtcZeroTime(this.uctZeroTime);
            }
        }

        public void showAllClocks()
        {
             foreach (string CityName in base.clocks.Keys)
            {
                Console.WriteLine(CityName + ":" + base.clocks[CityName].localTime);
            }
        }
    }
}

//PhoneClock,Clock的继承者,用于设置手机时间,从而将所有时区的时间设置
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ObserverClock
{
    public class PhoneClock : Clock
    {
        public PhoneClock(int utcOffset)
            : base(utcOffset)
        {

        }
        private UtcTime utcTime;

        public override void setLocalTime(int localTime)
        {
            base.localTime = localTime;
            utcTime.UctZeroTime = localTime - UTC_OFFSET;
        }

        public void setUtcTime(UtcTime _utcTime)
        {
            utcTime = _utcTime;
        }
    }
}

//CityClock,Clock的继承者,用于设置对应的时区时间
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ObserverClock
{
    public class CityClock : Clock
    {
        public CityClock( int utcOffset): base(utcOffset)
        {
          
        }
        public override void setLocalTime(int localTime)
        {
            base.localTime = localTime;
        }
    }
}

//Clock类,被观察者
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ObserverClock
{
    //抽象类
    public abstract class Clock
    {
        public Clock()
        {
 
        }
        public int UTC_OFFSET = 0;      
        public int localTime = 0;

        public Clock(int utcOffset)
        {
            UTC_OFFSET = utcOffset;
        }
        public abstract void setLocalTime(int localTime);

        public void setLocalTimeFromUtcZeroTime(int utcZeroTime)
        {
            this.localTime = Clock.MakeHourWithin0To23(utcZeroTime + this.UTC_OFFSET);
        }
        private static int MakeHourWithin0To23(int hour)
        {
            return (hour + 24) % 24;
        }
    }
}

//TimeSubject类,观察者,用于添加和移除被观察者
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ObserverClock
{
    public abstract class TimeSubject
    {
        protected Dictionary<string, Clock> clocks = new Dictionary<string, Clock>();

        public void attach(string cityName, Clock clock)
        {
            clocks.Add(cityName, clock);
        }

        public void detach(string cityName, Clock clock)
        {
            clocks.Remove(cityName);
        }

        public abstract void notifyAllClocks();
    }
}
原文地址:https://www.cnblogs.com/skyloverdan/p/9303618.html