观察者模式C#实现实例(二)

接着上一次的话题继续。

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

  定义的目标接口——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()),该怎么做?有没有思路?有没有实现?

  

时间: 2024-10-13 03:28:08

观察者模式C#实现实例(二)的相关文章

DWR入门实例(二)

DWR(Direct Web Remoting) DWR is a Java library that enables Java on the server and JavaScript in a browser to interact and call each other as simply as possible. Dwr能让在服务器端的java代码和浏览器客户端的javascript代码尽可能简单的相互调用. DWR is Easy Ajax for Java!  官网:http://d

Hibernate实例二

Hibernate实例二 一.测试openSession方法和getCurrentSession方法 hebernate中可以通过上述两种方法获取session对象以对数据库进行操作,下面的代码以及注解是对两种方法的辨析 SessionTest.java 1 import java.sql.Connection; 2 import java.sql.SQLException; 3 import java.util.Date; 4 5 import org.hibernate.Session; 6

Linux DNS的主从服务器配置实例(二)

在主DNS服务器运行正常的情况下,在另外的一台与之相同的服务器上配置从DNS服务器:操作如下: 我们这里创建DNS从服务器是实验,没有注册,,实际工作中需要注册才能正常使用,明白!!嘻嘻你懂得! 从服务器配置前提调试:(网络必须相同,小孩都知道的!)  1.统一时间  #ntpdate 172.16.0.1 -----指定时间服务器地址(瞬间跟新时间)  #corntab -e----------------------计划任务可以设置定期更新   */3 * * * * /sbin/ntpda

c#事件实例二

c#事件实例二 事件驱动程序与过程式程序最大的不同就在于,程序不再不停地检查输入设备,而是呆着不动,等待消息的到来,每个输入的消息会被排进队列,等待程序处理它.如果没有消息在等待, 则程序会把控制交回给操作系统,以运行其他程序. 操作系统只是简单地将消息传送给对象,由对象的事件驱动程序确定事件的处理方法.操作系统不必知道程序的内部工作机制,只是需要知道如何与对象进行对话,也就是如何传递消息. 先来看看事件编程有哪些好处. 1.使用事件,可以很方便地确定程序执行顺序. 2.当事件驱动程序等待事件时

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

原文:C语言库函数大全及应用实例二                                              [编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能: 直接使用BIOS服务的键盘接口 用 法: int bioskey(int cmd); 程序例: #i nclude #i nclude #i nclude #define RIGHT 0x01 #define LEFT 0x02 #define CTRL 0x04 #define ALT 0x0

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

有时候我们不需要把实体的所有属性都导出,只想把一部分属性导出为Json. 有时候我们的实体类会随着版本的升级而修改. 有时候我们想对输出的json默认排好格式. ... ... 请看下面的例子吧: 实体类: [java] view plaincopy import java.util.Date; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public 

WPF中的多进程(Threading)处理实例(二)

原文:WPF中的多进程(Threading)处理实例(二) 1 //错误的处理 2 private void cmdBreakRules_Click(object sender, RoutedEventArgs e) 3 { 4 Thread thread = new Thread(UpdateTextWrong); 5 thread.Start(); 6 } 7 8 private void UpdateTextWrong() 9 { 10 txt.Text = "Here is some n

Android笔记三十四.Service综合实例二

综合实例2:client訪问远程Service服务 实现:通过一个button来获取远程Service的状态,并显示在两个文本框中. 思路:如果A应用须要与B应用进行通信,调用B应用中的getName().getAuthor()方法,B应用以Service方式向A应用提供服务.所以.我们能够将A应用看成是client,B应用为服务端,分别命名为AILDClient.AILDServer. 一.服务端应用程序 1.src/com.example.aildserver/song.aidl:AILD文

flume实例二、监听目录日志上传到HDFS文件系统

一.概述 接实例一,实例一中server-aget是把日志上传保存到服务器上面,随着日志越来越大,公司启动了hadoop项目,需要把日志直接上传hdfs中保存,配置文件target_hdfs.conf如下: a2.sources = r2 a2.channels = c2 a2.sinks = k2 #source a2.sources.r2.type = avro a2.sources.r2.channels = c2 a2.sources.r2.compression-type = defl