接着上一次的话题继续。

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

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

  

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

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

  

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

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

 1 public class clock : Isub
 2     {
 3         private float times;
 4         List<Iobse> obse=new List<Iobse>() ;
 5
 6         public float Times
 7         {
 8             get
 9             {
10                 return times;
11             }
12
13             set
14             {
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

观察者模式C#实现实例(二)相关推荐

  1. C#2.0实例程序STEP BY STEP--实例二:数据类型

    C#2.0实例程序STEP BY STEP--实例二:数据类型 与其他.NET语言一样,C#支持Common Type Sysem(CTS),其中的数据类型集合不仅包含我们熟悉的基本类型,例如int, ...

  2. C语言库函数大全及应用实例二

                                                 [编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能: 直接使用BIOS服务的键盘接口 ...

  3. python 分数序列求和公式_Python分数序列求和,编程练习题实例二十四

    本文是关于Python分数序列求和的应用练习,适合菜鸟练习使用,python大牛绕行哦. Python练习题问题如下: 问题简述:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13 要 ...

  4. ENSP配置 实例二 单臂路由配置

    ENSP配置 实例二 单臂路由配置 单臂路由配置 配置 路由: interface EigabitEthernet0/0/0 ip address 10.0.1.1 24 interface Eiga ...

  5. 享元模式实例与解析实例二:共享网络设备(有外部状态)

    实例二:共享网络设备(有外部状态) 虽然网络设备可以共享,但是分配给每一个终端计算机的端口(Port)是不同的,因此多台计算机虽然可以共享同一个网络设备,但必须使用不同的端口.我们可以将端口从网络设备 ...

  6. MFC编程实例二:进度条的使用

    MFC编程实例二:进度条的使用 (以下蓝色字体为手动添加的代码) (1)   创建一个基于对话框的应用程序. (2)   在对话框界面添加一个文本框.一个进度条控件(Progress控件)和一个按钮. ...

  7. 计网 ---实例二:实验楼

    计网 -实例二:实验楼 LSW1 <Huawei>undo terminal monitor #去掉能使终端显示信息中心发送信息的功能 <Huawei>system-view ...

  8. php事件的应用场景,php观察者模式应用场景实例详解

    PHP观察者模式应用场景实例详解: header("Content-type: text/html; charset=utf-8"); /** * 观察者模式应用场景实例 * *  ...

  9. Json转换利器Gson之实例二-Gson注解和GsonBuilder

    有时候我们不需要把实体的所有属性都导出,只想把一部分属性导出为Json. 有时候我们的实体类会随着版本的升级而修改. 有时候我们想对输出的json默认排好格式. ... ... 请看下面的例子吧: 实 ...

  10. ps实例二:使用高斯滤镜制作图片阴影效果?

    实例二:使用高斯滤镜制作图片阴影效果 1.ctrl+单击图层,选中图片选区: 2.在该图层下面,新建一图层: 3.填充灰色:alt+delete(如果快捷键不行,就用油漆桶填充也行) 4.ctrl+D ...

最新文章

  1. 开发一个大型后台管理系统,应该用前后端分离的技术方案吗?
  2. 时间字符串与当前时间比較
  3. Object C为UILabel添加点击事件
  4. 图形学教程Lecture 14: RayTracing1(Acceleration Radiometry)知识点总结
  5. 2011 - 12 - 12记录2011 - 12 - 11
  6. c语言使用位运算符包含头文件,C语言的运算符
  7. 毕啸南专栏 | 专访云迹科技CEO支涛:人类可能会变成半机器人
  8. 深入浅出Hyper-V网络虚拟化(序)
  9. JS实现点击复制目标内容
  10. win7系统添加wifi连接到服务器,win7系统设置域账号连接企业内部域wifi的具体方法...
  11. P2422 良好的感觉
  12. 【Rust日报】 2019-05-22:Mozilla图像团队发布WebRender MVP
  13. android重力传感器横竖反,Android重力传感器--随重力旋转的图标
  14. 数据防泄密系统,你了解多少呢?
  15. manjaro Linux 手动安装mysql 5.7 每次重启系统都无法直接启动
  16. 教你用python画一个可爱皮卡丘!
  17. Canvas 绘制直线
  18. (3)DispatcherServlet与初始化主线
  19. Xilinx Zynq实现任意波形发生器仿真
  20. 四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析

热门文章

  1. 多通道半桥驱动器 NSD8308
  2. C#读取和写入注册表
  3. Travel Pass
  4. STM32 之六 USB IP(USB模块)、官方驱动版本 详解
  5. Rxjava源码分析之IO.Reactivex.CompositeDisposable
  6. 华为认证723(自用)
  7. 700MHz让中国移动成为最优秀的5G运营商,联通和电信难匹敌
  8. DAEMKL:基于多核学习的深度自动编码器预测miRNA与疾病的关联(IEEE Transactions on Neural Networks and Learning Systems)
  9. 真香!JetBrains 推出编程字体 Mono,开源免费可商用
  10. caffe源码理解之inner_product_layer