C#实现Observer观察者模式

namespace Observer
{
//定义一个委托,这里定义了观察者方法的签名,就是一个协议吧
public delegate void NumberEventHandler(object sender,NumberEventArgs e);
//要传递哪些参数到观察者?在这里定义,注意,要继承自EventArgs
public class NumberEventArgs : EventArgs
{
 public NumberEventArgs(int number)
 {
 _number = number;
 }
 private int _number;
 public int Number
 {
 get { return _number; }
 set { _number = value; }
 }
}
//观察者模式中的主题
public class Subject
{
 //定义一个事件,就是委托的实例了
public event NumberEventHandler NumberReached;
public void DoWithLoop(int number)
{
  for (int i = 0; i <= 100; i++)
  {
  //触发事件的条件到了
  if (i == number)
  {
   NumberEventArgs e = new NumberEventArgs(i);
   OnNumberReached(e);
  }
  }
}
//注意,这个方法定义为保护的,虚拟的,代表子类还可以进行覆盖,改变触发事件的行 为
//甚至可以不触发事件 protected virtual void OnNumberReached(NumberEventArgs e)
{
 //判断事件是否为null,也就是是否绑定了方法
 if (NumberReached != null) NumberReached(this, e);
}
}
public class MainProgram
{
public static void Main()
{
 Console.WriteLine("Please Input a 0-100 Number:");
 int input = Console.Read();
 if (input < 0 || input > 100) { Console.WriteLine("Error"); }
 Subject s = new Subject();
 //给事件绑定方法,静态的
 s.NumberReached += new NumberEventHandler(msgbox_NumberReached);
 MainProgram mp = new MainProgram();
 //给事件绑定方法,实例方法
 s.NumberReached += new NumberEventHandler(mp.console_NumberReached);
 s.DoWithLoop(input); Console.Read();
}
 void console_NumberReached(object sender, NumberEventArgs e)
 {
 Console.WriteLine(e.Number.ToString());
 }
 static void msgbox_NumberReached(object sender, NumberEventArgs e)
 { 
 MessageBox.Show(e.Number.ToString());
 }
}
}

时间: 2025-01-27 00:38:46

C#实现Observer观察者模式的相关文章

php设计模式 Observer(观察者模式)

复制代码 代码如下: <?php /** * 观察者模式 * * 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新 * 能够便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能 * 插件系统 */ class Observerable { private $_observers = array(); public function registerObserver($observer) { $this->_observer

php设计模式 Observer(观察者模式)_php技巧

复制代码 代码如下: <?php /** * 观察者模式 * * 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新 * 能够便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能 * 插件系统 */ class Observerable { private $_observers = array(); public function registerObserver($observer) { $this->_observer

php Observer观察者模式之学习笔记

那么如何让各家电脑知道自己的盟友被攻击了呢?并且自动做出反应? 待解决的问题:一旦某个电脑被我们进攻,其他电脑就获知,并且自动出兵救援. 思路:为电脑设置一些额外的观察系统,由他们去通知其他电脑.   观察者(Observer)模式示例:  代码如下 复制代码 <?php //抽象的结盟类 abstractclassabstractAlly{ //放置观察者的集合,这里以简单的数组来直观演示 public$oberserverCollection; //增加观察者的方法,参数为观察者(也是玩家)

设计模式学习笔记(七)—Observer观察者模式

<设计模式>一书对Observer是这样描述的: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新. 举个例子,在现实生活中,父母与孩子是最亲密的人.父母做为孩子(被观察者)的监护人(观察者),当孩子和别人打架后,一定会告诉他的父母这件事(呵呵,当孩子很小时,通常会告诉父母,长大了以后,可能不会,这里的孩子指的是小孩子),当孩子获得奖学金后,也一定会告诉他的父母.下面我用Observer实现这个程序.代码如下: import java.ut

.NET设计模式-观察者模式(Observer Pattern)

概述 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>] 结构图 图1 Observer模式

实例解析Ruby设计模式开发中对观察者模式的实现_ruby专题

一般来说,观察者模式的定义应该是这样的:building a clean interface between the source of news that some object has changed and the consumers of that news. 观察者模式在消息的生产者和消费者之间建立了clean interface,这样就使得消息的生产者和消费者之间的耦合是抽象的.被观察者可以不认识任何一个的观察者,它只知道他们都实现了一个共同的接口.由于观察者和被观察者没有紧密的耦合

php设计模式及耦合性和多形性

什么是设计模式: 设计模式就是一个教你如何利用真实可靠的设计来组织你的代码的模板. 所有的设计模式都有一些常用的特性:一个标识(a name),一个问题陈述(a problem statement)和一个解决方案(a solution). 1.一个设计模式的标识是重要的,因为它会让其他的程序员不用进行太深入的学习就能立刻理解你的代码的目的(至少通过这个标识程序员会很熟悉这个模式). 2.问题描述是用来说明这个模式的应用的领域. 3.解决方案描述了这个模型的执行.一个好的设计模式的论述应该覆盖使用

设计模式学习笔记系列

设计模式学习笔记(二十二)-FlyWeight享元模式 设计模式学习笔记(二十一)-Composite模式 设计模式学习笔记(二十)-Visitor访问者模式 设计模式学习笔记(十九)-Chain of Responsibility职责链模式 设计模式学习笔记(十八)-Mediator中介者模式 设计模式学习笔记(十七)-Memento备忘录模式 设计模式学习笔记(十六)-Proxy模式 设计模式学习笔记(十五)-State模式 设计模式学习笔记(十四)-Command模式 设计模式学习笔记(十

java nio基础使用示例_java

在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式.传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据读入.归纳为:1.java io为阻塞,在打开一个io通道后,read将一直等待在端口一边读取字节内容,如果没有内容进来,read相当于阻塞掉了.2.在1的基础上改进为,开设线程,serversocker.accept()后让线程去等待,但是当并发量高的时候,相当耗费资源的.3.java nio为非阻塞,采用的是reactor反应堆模式,或者说observe