监听者模式

四人组笔记:监听者模式

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  
改变自己
原文地址:https://www.cnblogs.com/sun-shadow/p/6230888.html