博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者模式C#实现实例(二)
阅读量:5982 次
发布时间:2019-06-20

本文共 2818 字,大约阅读时间需要 9 分钟。

接着上一次的话题继续。

上一篇中讲了实现思路,这篇中就直接上代码了

  定义的目标接口——Isub,具体实现如下:

  

1  public interface Isub2     {3         void addobser(Iobse obe);4         void removeobser(Iobse ove);5         void notify();6     }

  定义的观察者接口——Iobse,具体实现如下:

  

1 public interface Iobse2     {3         void update(float times);4     }

 

定义实现目标接口的目标类——clock,具体实现如下:

1 public class clock : Isub 2     { 3         private float times; 4         List
obse=new List
() ; 5 6 public float Times 7 { 8 get 9 {10 return times;11 }12 13 set14 {15 times = value;16 }17 }18 19 public void addobser(Iobse obe)20 {21 obse.Add(obe);22 }23 24 public void notify()25 {26 for(int i = 0; i < obse.Count(); i++) 27 {28 Iobse Iose = (Iobse)obse[i];29 Iose.update(Times);30 }31 }32 33 public void removeobser(Iobse ove)34 {35 obse.Remove(ove);36 }37 }

这里要说明的是,具体目标类除了要实现接口内的方法外,还要定义我们所关心的数据,这里是times。

 

接下来是实现观察者A和观察者B了,具体代码如下:

对于A有:

  

1 public class A : Iobse 2     { 3         private float times; 4         private clock c2 = new clock(); 5         public A(clock c2) 6         { 7             this.c2 = c2; 8             c2.addobser(this); 9         }10         public void update(float times)11         {12             this.times = times;13             if (times > 9 * 60)                    //这里是我们对所关心的数据times所作出的一个反映——打印出一条信息14             {15                 MessageBox.Show("已经9点,可以起床了");16             }17         }18     }

对于B,有:

1  public class B : Iobse 2     { 3         private float times; 4         private clock c1 = new clock(); 5         public B(clock c1) 6         { 7             this.c1 = c1; 8             c1.addobser(this); 9         }10             11                 12             13         public void update(float times)14         {15             this.times = times;16             if (times > 9 * 60 + 30)17             {18                 MessageBox.Show("已经超过9点半了,上班要迟到了");19             }20         }21     }

 

最后一步,展示结果。

  在这里我在WPF的MainWindow上定义了一个Button,并新建一个单击事件用来展示结果。代码如下:

1  private void button_Click(object sender, RoutedEventArgs e)2         {3             clock c1 = new clock();4             c1.Times = 9 * 60 + 2;5             A a = new A(c1);6             B b = new B(c1);7             c1.notify();8         }

不出意外的话,将会弹出Messagebox。

 

不足之处,这里的代码非常简陋,并没有加保护,但是这也是为了表意清晰,我们可以在方法的内部做一些封装保护,而不是这样“裸奔”,当然这个实例只是做交流学习使用。

 

关于后续拓展,当我们建立完clock类,A类,B类之后我们还可以添加一个观察者C类,那么如果添加一个C类,并对时间大于10点(这里用10*60的数字表示就好)作出反映(例如执行一个动作eat()),该怎么做?有没有思路?有没有实现?

 

  

转载于:https://www.cnblogs.com/leelds/p/6832318.html

你可能感兴趣的文章
Atom 编辑器系列视频课程
查看>>
[原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)
查看>>
mybatis update返回值的意义
查看>>
expdp 详解及实例
查看>>
通过IP判断登录地址
查看>>
深入浅出JavaScript (五) 详解Document.write()方法
查看>>
Beta冲刺——day6
查看>>
在一个程序中调用另一个程序并且传输数据到选择屏幕执行这个程序
查看>>
代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能
查看>>
关于在VS2005中编写DLL遇到 C4251 警告的解决办法
查看>>
提高信息安全意识对网络勒索病毒说不
查看>>
我的友情链接
查看>>
IDE---Python IDE之Eric5在window下的安装
查看>>
基本安装lnmp环境
查看>>
yum源资料汇总
查看>>
7、MTC与MTV,http请求介绍
查看>>
logstash消费阿里云kafka消息
查看>>
MAXIMO 快速查找实现
查看>>
Oracle——条件控制语句
查看>>
day-6 and day-7:面向对象
查看>>