技术开发 频道

.net设计模式之观察者模式


.net中的观察者模式

    在.net中,微软给我们带来一个更好的观察者模式的实现:事件-委托.

    在Gof的观察者模式中(姑且称之为经典设计模式吧),观察者必须实现一个统一的接口,在.net里这个接口由委托的签名来保证了,.net里的委托就是一个安全的函数指针(之所以说安全是与以前的C指针相比的,C的函数指针并不包括函数的签名比如参数等东西,所以可以传递一个并不是你期望的函数进去,导致运行时出错,由于这种错误在运行时发生,很难检查出来)。Ok,现在以一个.net的委托-事件的例子结束今天的观察者模式吧。

    描述:这是一个控制台程序,程序接收一个0到100之间整型的输入,程序接收到输入后开始一个从0到100的循环,当循环到你输入的数字的时候做一些处理,我们将以两种方式来描述这个实例,先用常规的方式,然后采用委托-事件的方式
public class Program
{
static void Main(string[] args)
{
Console.WriteLine("Please Input a 0-100 Number:");
int input = Console.Read();
if (input < 0 || input > 100)
{
Console.WriteLine("Error");
}
for (int i = 0; i <= 100; i++)
{
if (i == input)
{
//屏幕输出
Console.WriteLine(i.ToString());
//弹出提示框
MessageBox.Show(i.ToString());
//可能还有其他处理
}
}
}
}
   看到这个例子有什么感觉?循环的代码和处理的代码混在一起,可能还有未知的处理方式添加进来。耦合度非常高。再看看.net的处理方式吧

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);
}
}
0
相关文章