zoukankan      html  css  js  c++  java
  • 监听者模式

    四人组笔记:监听者模式

    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  
    改变自己
  • 相关阅读:
    全文搜索 Contains 与like 的区别
    Easyui _treegrid 动态加载子节点
    十五、ES开启SSL访问
    十二、ES分词器
    十一、ES监控
    十六、源码部署EFK之快乐没有了
    十四、ES开启密码认证
    十三、ES备份恢复
    十七、优化ES
    正则表达式
  • 原文地址:https://www.cnblogs.com/sun-shadow/p/6230888.html
Copyright © 2011-2022 走看看