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