观察者模式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模式是一种 ...
随机推荐
- android.support.v4.app.NotificationCompat引用包
在导入使用了ViewPage,ActionBar,Fragment的工程后出现错误,很有可能是没有导入4.0版本的支持包.本人也是碰到这个问题,特意搜索了一下,得到解决办法如下,记录下来,以免忘记. ...
- 初识SEO
一.什么是SEO 1.SEO 搜索引擎优化(Search Engine Optimization)指通过对网站进行站内优化和修复(网站Web结构调整.网站内容建设.网站代码优化和编码等)和站外优化,从 ...
- iptables 配置说明
#配置,禁止进,允许出,允许回环网卡 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEP ...
- python之psutil
psutil = process and system utilities, psutil是个跨平台库,能够轻松实现获取系统运行的进程和系统利用率,包括CPU.内存.磁盘.网络等信息. Linux系统 ...
- Shell:常用+好用命令
1.#删除15天前的数据 find /usr/local/chen/backup/ -mtime +15 -exec rm -f {} \; 2.release=`echo $name | cut - ...
- signalR客户端调用服务端方法失败
现象: 在VS中修改集线器代码后,重新生成解决方案,客户端js调用服务端方法提示undefined. 检查后台代码未发现错误. 检查js代码未发现错误(方法名称符合小驼峰规范). 解决方法: 先清理解 ...
- 《深入理解java虚拟机》读书笔记——java内存区域和内存溢出异常
几种内存溢出异常: 堆溢出 原因:创建过多对象,并且GC Roots到对象之间有可达路径. 分两种情况: Memory Leak:无用的对象没有消除引用,导致无用对象堆积.例如<Effictiv ...
- K数和问题
问题描述 给定n个不同的正整数(数组num),整数k(k < = n)以及一个目标数字target.在这n个数里面找出k个数,使得这k个数的和等于目标数字,求问有多少种方案? 解决思路 该类问题 ...
- IDEA与eclipse:vm参数调优笔记
我的电脑配置12G内存,64位,win10系统. 首先,idea,是在idea中安装目录下的bin目录下面找到位的同学注意找到idea32.exe.vmoptions的文件去编辑. 更改文件,无非大多 ...
- ArcGIS 要素类平移工具-arcgis案例实习教程
ArcGIS 要素类平移工具-arcgis案例实习教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:对整个要素类,按指定偏移距离,进行整体平移. 优点:使用 ...