您的位置:首页 > 编程语言 > C#

c#观察者模式和事件委托的联合使用

2017-12-01 16:37 771 查看
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//观察者模式和事件委托的联合使用
namespace 委托和事件2
{
//热水器的类,被监视的对象
public class Heater
{
private int temperature;//水温
public delegate void heatEventHandler(int para);
public event heatEventHandler heat;  //声明事件 事件的命名为委托去掉EventHandler之后的部分
//烧水
public void boilWater()
{
for (int i = 0; i <= 100; i++)
{
temperature = i;
if (temperature >= 98)
{
if (heat != null) //有方法注册进事件中
{
heat(temperature); //在条件满足的情况下通知观察者
}
}
}

}
}

//警报类,observer的角色
public class Alarm
{
public void boilVoice(int para)
{
Console.WriteLine("嘀嘀嘀");
}
}
//显示类。显示水温,observer的角色
public class Show
{
public void ShowTemperature(int para)
{
Console.WriteLine("水温已经{0}度了",para);
}
}

//
class Program
{
static void Main(string[] args)
{
Heater heater = new Heater();
Alarm alarm = new Alarm();
Show show = new Show();
heater.heat += alarm.boilVoice;
heater.heat += show.ShowTemperature;
heater.boilWater();
Console.Read();
}
}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 事件访问器
{
//定义委托
public delegate string GeneralEventHandler();
//定义事件的发布者
public class Publisher
{
private GeneralEventHandler _delegate;
public event GeneralEventHandler geneal //事件访问器的定义
{
add { _delegate = value; }
remove { _delegate -= value; }
}
public void DoSomething()
{
if (_delegate != null)
{
string str = _delegate();
Console.WriteLine(str);
}
}
}
//定义事件的订阅者
public class Subscriber
{
public string method()
{
return "liK";
}

}
class Program
{
static void Main(string[] args)
{
Publisher ps = new Publisher();
Subscriber sb = new Subscriber();
ps.geneal += sb.method;
ps.DoSomething();
Console.Read();
}
}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托和事件返回值研究
{
public delegate string testEventHandler();
class AA
{
public testEventHandler test;
public void method()
{
if (test != null)
{
Console.WriteLine(test());
}
}
}
class BB
{
public static string bb()
{
return "likang01";
}
}
class CC
{
public static string cc()
{
return "likang02";
}
}
class Program
{
static void Main(string[] args)
{
AA aa = new AA();   //委托变量可以供对个订阅者注册,如果定义了返回值,那么对个订阅者都会向发布者返回数值
aa.test = BB.bb;    //结果就是后面的一个返回值将前面的返回值覆盖了,实际上只能获得最后一个方法调用的返回值
aa.test += CC.cc;
aa.test -= CC.cc;
aa.method();
Console.Read();
}
}
}


这篇文章是学习博客园一位大神的笔记吧,大神还写了事件和委托的高级篇,无赖不甚理解,暂时不上了,要看的直接访问http://www.cnblogs.com/JimmyZhang/archive/2008/08/22/1274342.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c#