.net 委托(委托链)的若干“陷阱”[续]
作者:网络转载 发布时间:[ 2013/6/18 9:45:00 ] 推荐标签:
陷阱2:“调用委托像调用方法一样简单”
上一篇博文分析了设计模式中“观察者模式”常被忽略的两个细节:“异常”和“阻塞”。本文将使用委托重写上文“观察者模式”中的小故事。同时和大家一起看看,调用委托是不是像调用方法一样简单。
[观察者模式中"主题类"代码示例]
/// <summary>
/// 通过委托发送通知的主题
/// </summary>
public class DelegateSubject
{
//委托定义
public delegate void NotifyEventHandler(string msg);
//委托实例(观察者接收消息的委托实例)
public NotifyEventHandler NotifyObservers = null;
//主题名称:如天气
public string SubjectName { get; set; }
//发布的消息
public string Message { get; set; }
//主题构造函数
public DelegateSubject(string subjectName)
{
SubjectName = subjectName;
}
//通过委托发送通知(调用观察者接收消息的方法)
public void Notify()
{
NotifyEventHandler tempNotifyHander = NotifyObservers;
if (tempNotifyHander != null)
{
//调用委托像调用方法一样简单。?
tempNotifyHander(Message);
}
}
}
[观察者模式中"观察者类"代码示例]
/// <summary>
/// 具体观察者
/// </summary>
public class ConcreteObserver : IObserver
{
//观察者名称:如学校、公司
public string ObserverName { get; set; }
//观察者能识别的天气
string[] weather = { "毛毛雨", "大雨","晴天" };
//构造观察者对象
public ConcreteObserver(string observerName)
{
ObserverName = observerName;
}
//收到天气主题发来的通知
public void NewMessage(string msg)
{
if (weather.Contains(msg)) //观察者能识别的天气
{
Console.WriteLine(ObserverName + "收到新通知:" + msg);
Thread.Sleep(2000);
Console.WriteLine(ObserverName + "收到新通知,处理了2s");
}
else //突然来了鬼天气...
{
Console.WriteLine(ObserverName + "收到新通知:" + msg);
Console.WriteLine(ObserverName + "被吓坏了,没见过这鬼天气!!!乱套了...");
throw new Exception(ObserverName + "没处理好" + msg + ",出异常了");
}
}
}
[测试代码示例]
private static void TestDelegateObserverPattern()
{
try
{
DelegateSubject subject_Weather = new DelegateSubject("天气");
IObserver observer_School = new ConcreteObserver("学校");
IObserver observer_Company = new ConcreteObserver("公司");
subject_Weather.NotifyObservers += observer_School.NewMessage;
subject_Weather.NotifyObservers += observer_Company.NewMessage;
subject_Weather.Message = "毛毛雨";
subject_Weather.Notify();
Console.WriteLine();
subject_Weather.Message = "飓风";
subject_Weather.Notify();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11