四人组笔记:监听者模式
1.一对多的关系
2.subject触发多个observe的更新
3.注意pull和push数据的方式。 本例使用pull,监听者按需获取数据,
4.添加subject是否需要通知observe的条件判断,IsChange() 63行。
代码规范:
改变老代码的地方,需要封装
针对接口编程
游戏中服务器和客户端的通信,可理解为监听者模式...
本测试:三个observe,使用数据pull,使用条件判断,使用输出模拟subject的更新
1 namespace DesignModeTest 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 WeatherInfoClass weatherInfo = new WeatherInfoClass(); 8 TemperatureClass temperatureTips = new TemperatureClass(); 9 HumClass humTips = new HumClass(); 10 WeatherClass weatherTips = new WeatherClass(); 11 12 weatherInfo.AddObserver(temperatureTips); 13 weatherInfo.AddObserver(humTips); 14 weatherInfo.AddObserver(weatherTips); 15 16 weatherInfo.Updata(10, 1, WeatherType.Cloudy); 17 weatherInfo.Updata(30, 2, WeatherType.Sun); 18 weatherInfo.Updata(1, 1, WeatherType.Rain); 19 20 } 21 22 enum WeatherType 23 { 24 Sun = 1,//晴 25 Cloudy = 2,//阴 26 Rain = 3//雨 27 } 28 interface MySubject //被监听者需要有的 29 { 30 void AddObserver(MyObserver obj); 31 void ChangeData(); 32 void RemoveObserver(MyObserver obj); 33 } 34 /// <summary> 35 /// 可监听者 36 /// </summary> 37 class WeatherInfoClass : MySubject 38 { 39 private const int LimitTemperature = 20; 40 private int mTemperature;//温度 41 private int mHum;//湿度 42 private WeatherType mWeather; 43 44 private List<MyObserver> mObserverList = new List<MyObserver>(); 45 46 #region 监听者拉pull数据需要 47 public int GetTemperature() 48 { 49 return mTemperature; 50 } 51 52 public int GetHum() 53 { 54 return mHum; 55 } 56 57 public WeatherType GetWeather() 58 { 59 return mWeather; 60 } 61 #endregion 62 63 private bool IsChange() 64 { 65 if (mTemperature < LimitTemperature) 66 { 67 return true; 68 } 69 return false; 70 } 71 72 public void Updata(int temperature, int hum, WeatherType weathertype) 73 { 74 mTemperature = temperature; 75 mHum = hum; 76 mWeather = weathertype; 77 78 if (IsChange()) 79 { 80 ChangeData(); 81 } 82 } 83 84 85 public void AddObserver(MyObserver obj) 86 { 87 if (!mObserverList.Contains(obj)) 88 { 89 mObserverList.Add(obj); 90 } 91 } 92 93 public void ChangeData() 94 { 95 for (int i = 0; i < mObserverList.Count; ++i) 96 { 97 mObserverList[i].Update(this); 98 } 99 } 100 public void RemoveObserver(MyObserver obj) 101 { 102 mObserverList.Remove(obj); 103 } 104 105 } 106 107 108 interface MyObserver 109 { 110 void Update(MySubject subject); 111 void Display(); 112 } 113 114 class TemperatureClass : MyObserver 115 { 116 private int mTemperature; 117 private int mHum; 118 119 public void Update(MySubject subject) 120 { 121 WeatherInfoClass info = subject as WeatherInfoClass; 122 if (info != null) 123 { 124 mTemperature = info.GetTemperature(); 125 mHum = info.GetHum(); 126 Display(); 127 } 128 } 129 130 public void Display() 131 { 132 Console.WriteLine("TemperatureClass 温度:" + mTemperature + " 湿度:" + mHum); 133 } 134 } 135 136 class HumClass : MyObserver 137 { 138 private int mHum; 139 public void Update(MySubject subject) 140 { 141 WeatherInfoClass info = subject as WeatherInfoClass; 142 if (info != null) 143 { 144 mHum = info.GetHum(); 145 Display(); 146 } 147 } 148 149 public void Display() 150 { 151 Console.WriteLine("HumClass 湿度:" + mHum); 152 } 153 } 154 155 class WeatherClass : MyObserver 156 { 157 private WeatherType mWeatherType; 158 public void Update(MySubject subject) 159 { 160 WeatherInfoClass info = subject as WeatherInfoClass; 161 if (info != null) 162 { 163 mWeatherType = info.GetWeather(); 164 165 Display(); 166 } 167 } 168 169 public void Display() 170 { 171 Console.WriteLine("WeatherClass 天气:" + mWeatherType); 172 } 173 } 174 175 } 176 } 177