接着上一次的话题继续。

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

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

  

  public interface Isub
{
void addobser(Iobse obe);
void removeobser(Iobse ove);
void notify();
}

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

  

 public interface Iobse
{
void update(float times);
}

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

 public class clock : Isub
{
private float times;
List<Iobse> obse=new List<Iobse>() ; public float Times
{
get
{
return times;
} set
{
times = value;
}
} public void addobser(Iobse obe)
{
obse.Add(obe);
} public void notify()
{
for(int i = ; i < obse.Count(); i++)
{
Iobse Iose = (Iobse)obse[i];
Iose.update(Times);
}
} public void removeobser(Iobse ove)
{
obse.Remove(ove);
}
}

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

 

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

对于A有:

  

 public class A : Iobse
{
private float times;
private clock c2 = new clock();
public A(clock c2)
{
this.c2 = c2;
c2.addobser(this);
}
public void update(float times)
{
this.times = times;
if (times > * ) //这里是我们对所关心的数据times所作出的一个反映——打印出一条信息
{
MessageBox.Show("已经9点,可以起床了");
}
}
}

对于B,有:

  public class B : Iobse
{
private float times;
private clock c1 = new clock();
public B(clock c1)
{
this.c1 = c1;
c1.addobser(this);
} public void update(float times)
{
this.times = times;
if (times > * + )
{
MessageBox.Show("已经超过9点半了,上班要迟到了");
}
}
}

最后一步,展示结果。

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

  private void button_Click(object sender, RoutedEventArgs e)
{
clock c1 = new clock();
c1.Times = * + ;
A a = new A(c1);
B b = new B(c1);
c1.notify();
}

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

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

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

  

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

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

    原文:C语言库函数大全及应用实例二                                              [编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能 ...

  2. Hibernate实例二

    Hibernate实例二 一.测试openSession方法和getCurrentSession方法 hebernate中可以通过上述两种方法获取session对象以对数据库进行操作,下面的代码以及注 ...

  3. Ajax实例二:取得新内容

    Ajax实例二:取得新内容 通过点击pre和next按钮,从服务器取得最新内容. HTML代码 <div id="slide">图片显示区</div> &l ...

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

    原文:WPF中的多进程(Threading)处理实例(二) //错误的处理 private void cmdBreakRules_Click(object sender, RoutedEventArg ...

  5. express+nodecoffee写passport登录验证实例(二)

    二:实现登录认证 passport官网文档:  http://passportjs.org/guide/ passport验证使用一种被称为“策略”的方式来验证请求,策略支持3种类型的验证:用户名密码 ...

  6. DWR入门实例(二)

    DWR(Direct Web Remoting) DWR is a Java library that enables Java on the server and JavaScript in a b ...

  7. 观察者模式的程序实例C++

    一.什么是观察者模式 Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种.Observer模式是行为模式之中的一个,它的作用是当一个对象的状态发生变化时,可以自己主动通知其它 ...

  8. [原创]MongoDB综合实例二

    MongoDB-Sharding部署方案 一.    部署环境 五台主机: Amongoshard01:  10.212.74.43 Amongoshard02:  10.212.84.4 Among ...

  9. 委托、事件、Observer观察者模式的使用解析二

    一.设计模式-Observer观察者模式 Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新.Observer模式是一种 ...

随机推荐

  1. shell编程变量介绍与表达式详解

    shell变量简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据.脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则. 在 Bash shell ...

  2. 入门Spring ioc

    简单的来记录一下自己的SSM框架入门--------IOC篇段 ioc(控制反转 -将对象的创建的权利从类型本身来创建,来交给spring工厂来创建)的配置. <bean>:是可以指spr ...

  3. 直达核心的快速学习PHP入门技巧

    PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,是目前最火的 ...

  4. orcal - 子查询

    where 单行单列 SELECT AVG(sal) from emp; SELECT * FROM EMP WHERE sal <(SELECT AVG(sal) from emp); 单行多 ...

  5. python3 写excel文件 xlsxwriter模块

    之前一直用这个传说中可以让python飞起来的xlwings模块来写入excel文件,今天发现xlsxwriter模块,发现这才是飞起来的feel!! 使用体验对比: xlwings:写入7000+单 ...

  6. python大法好——Python SMTP发送邮件

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  7. TypeError: Fetch argument 0 has invalid type <type 'int'>, must be a string or Tensor. (Can not convert a int into a Tensor or Operation.)

    6月5日的時候,修改dilated_seg.py(使用tensorflow)出現了報錯: TypeError: Fetch argument 0 has invalid type <type ' ...

  8. __name__ __main__ 作用

    1 __name__ 在自己文件下面执行 就显示__main__ 2 如果__name__是在其他文件里面,然后通过当前文件调用到其他文件执行,就会显示的当前文件路劲的文件名结果: if __name ...

  9. Django11-ModelForm

    一.定义ModelForm类 # 创建部门表单校验 class DepartmentForm(forms.ModelForm): class Meta: model = models.Departme ...

  10. gradle问题汇总

    问题:从SVN下载到本地后,gradle无法同步,报错如下:Failed to resolve: support-core-utilsFailed to resolve: support-media- ...