观察者模式C#实现实例(二)
接着上一次的话题继续。
上一篇中讲了实现思路,这篇中就直接上代码了
定义的目标接口——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#实现实例(二)的更多相关文章
- C语言库函数大全及应用实例二
原文:C语言库函数大全及应用实例二 [编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能 ...
- Hibernate实例二
Hibernate实例二 一.测试openSession方法和getCurrentSession方法 hebernate中可以通过上述两种方法获取session对象以对数据库进行操作,下面的代码以及注 ...
- Ajax实例二:取得新内容
Ajax实例二:取得新内容 通过点击pre和next按钮,从服务器取得最新内容. HTML代码 <div id="slide">图片显示区</div> &l ...
- WPF中的多进程(Threading)处理实例(二)
原文:WPF中的多进程(Threading)处理实例(二) //错误的处理 private void cmdBreakRules_Click(object sender, RoutedEventArg ...
- express+nodecoffee写passport登录验证实例(二)
二:实现登录认证 passport官网文档: http://passportjs.org/guide/ passport验证使用一种被称为“策略”的方式来验证请求,策略支持3种类型的验证:用户名密码 ...
- DWR入门实例(二)
DWR(Direct Web Remoting) DWR is a Java library that enables Java on the server and JavaScript in a b ...
- 观察者模式的程序实例C++
一.什么是观察者模式 Observer模式也叫观察者模式,是由GoF提出的23种软件设计模式的一种.Observer模式是行为模式之中的一个,它的作用是当一个对象的状态发生变化时,可以自己主动通知其它 ...
- [原创]MongoDB综合实例二
MongoDB-Sharding部署方案 一. 部署环境 五台主机: Amongoshard01: 10.212.74.43 Amongoshard02: 10.212.84.4 Among ...
- 委托、事件、Observer观察者模式的使用解析二
一.设计模式-Observer观察者模式 Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新.Observer模式是一种 ...
随机推荐
- 理解block和inode
什么是block和inode? 定义:block就像是杯子 inode就像是杯子的编号,因为杯子太多了 1.根据文件的大小,在磁盘中储存时会占用一个或多个block:那么究竟多大的文件会使用一个blo ...
- C#学习-图解教程(2):访问修饰符(其中两种)
学习内容:C#:学习书籍:图解教程(中文第四版). 目录:第四章 类的基本概念 -----> 4.8 访问修饰符 访问修饰符 从类的内部,任何函数成员都可以使用成员的名称访问类中任意的其他成员. ...
- Winfrom中的几种传值方式
1.最常见的一种, 不知道你们是否记得构造函数,当然这是对有点基础的人说的, 再我们申明一个类的时候,可能很多时候都不会注意,因为会我们的编辑器自带会默认生成一个不带参数的构造函数, 所以不在意,但是 ...
- CSS3之动画模块实现轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- win10系统搜索不到某些老式打印机
问题: win10系统在设置选项里面搜索打印机,却找不到打印机. 百度了一下: 基本说的是驱动问题. 解决方法: 1.下载lansee局域网扫描软件 2.打开嗅探工具点击开始 3.搜索出来之后,会在共 ...
- [python,2018-06-29] 37%法则及其拓展解决恋爱问题
37%法则 苏格拉底的问题: 在一片麦田里摘出一颗最大最好的麦穗.但只能摘一次,而且不能回头. 传说这是苏格拉底给他的弟子柏拉图提出的问题,又传说柏拉图进行了2次选择: 1.柏拉图第一次走进麦田,他发 ...
- leetCode104. 二叉树的最大深度
给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7], ...
- linux网编 静态链接库
-L 指定动态库路径 -l 指定 以libXXXX.a命名的库文件
- python-day19 Django模板,路由分发,ORM
@获取文件所有数据 request.FILES: request.POST.get('fafafa')#拿到文件名: user = request.POST.get('user',None)#用get ...
- 05 JS基础DOM
JS的window对象定时器: window下一些方法: <script> 弹出 window.alert('hello') 返回布尔值 var ret = window.confirm( ...