接着上一次的话题继续。

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

  定义的目标接口——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. php laravel加密 form表单认证 laravel分页

    use Illuminate\Support\Facades\Crypt; echo Crypt::encrypt(123); //加密echo "<br>";//解密 ...

  2. python_14 静态属性、类方法、静态方法;组合;继承

    静态属性 在类中函数前加@property,在实例调用函数时无需加(),将函数属性封装,调用时看起来与数据属性类似 将函数封装成数据属性的形式,外部调用时看不到逻辑,静态属性可以访问实例属性也可以访问 ...

  3. C# ConfigurationManager不存在问题解决

    在做串口通信的时候,需要使用"ConfigurationManager"类,但是添加"Using System.Configuration"命名空间后编译器依旧 ...

  4. abaqus2016安装过程中出现error:unable to add abaqus command directory to PATH variable

    请问abaqus2016安装过程中出现error:unable to add abaqus command directory to PATH variable是什么原因,怎么解决啊,总是安装失败 这 ...

  5. MySQL Windows环境变量设置

    问题:MySQL无法全局使用 1.查找MySQL路径 2.添加环境变量 3.验证功能

  6. 《Java开发学习大纲文档》V6.0(已经不公布了,请查看第七版)

    <Java开发大纲学习文档第六版>简介: 有需要的私聊作者QQ:253173641.

  7. struts2注解json 配置文件json

    java提供了便捷的Json-lib  类库,能够让我们很方便的将 Array / JavaBean / Map 解析成 JSON 串,当然反之也是可以的. struts2借助于json-lib类库, ...

  8. js导出excel文件

    <div id="tablesDiv"> <table id="tabDiv1"> <tbody><tr> &l ...

  9. CSS 文字太多用省略号表示

    width:150px;/*要显示文字的宽度*/ overflow:hidden; /*超出的部分隐藏起来.*/ white-space:nowrap;/*不显示的地方用省略号...代替*/ text ...

  10. 在Ubuntu上升级SQLite,并让Python使用新版SQLite

    (本文适用于Debian系的Linux,如Ubuntu.Raspbian等等.) 在Linux上,Python的sqlite3模块使用系统自带的SQLite引擎,然而系统自带的SQLite可能版本太老 ...