using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//// 实例化一个出版社
//Publiser publisher = new Publiser();
//Console.Write("请输入要发行的杂志:");
//string name = Console.ReadLine();
//if (name == "读者杂志")
//{
// //给这个出读者杂志的事件注册感兴趣的订阅者,此例中是 李杰
// publisher.Publish += new Publiser.PublishEventHander(LiJie.Receive);
// //发布者在这里触发出版 读者杂志 的事件
// publisher.Issue("读者杂志");
//}
//if (name == "环球日报")
//{
// publisher.Publish += new Publiser.PublishEventHander(MrChen.Receive);
// publisher.Issue("环球日报");
//}
// 事件运用
Boss boss = new Boss();
// 被叫干活的人,,被委托的人 下属1
boss.OnOrder += new Boss.DoSomethingEventHandler(new Subordinate().DoSomething);
boss.OnOrder += new Subordinate2().DoSomething; // 两种事件注册方式
boss.OrderEvent();
Console.ReadKey();
}
}
//一、委托类型的名称都应该以EventHandler结束。
//二、委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
//三、事件的命名为 委托去掉 EventHandler之后剩余的部分。
//四、继承自EventArgs的类型应该以EventArgs结尾。
// 所有订阅者【Subscriber】感兴趣的对象,也就是e,都要继承微软的EventArgs
// 本例中订阅者【也称观察者】MrMing,MrZhang他们感兴趣的e对象,就是杂志【magazine】
public class PubEventArgs : EventArgs
{
public readonly string magazinName;
public PubEventArgs() { } // 构造
public PubEventArgs(string magazinName11)
{
magazinName = magazinName11;
}
}
//发布者(Publiser)
public class Publiser
{
// 声明一个出版的委托
// 这里多了一个参数sender,它所代表的就是Subject,也就是监视对象,本例中就是Publisher
public delegate void PublishEventHander(object sender, PubEventArgs e);
// 在委托的机制下我们建立一个 出版事件
public event PublishEventHander Publish;
// 声明一个可重写的 OnPublish 的保护函数
protected virtual void OnPublish(PubEventArgs e)
{
if (Publish != null)
{
Publish(this, e);
}
}
// 事件必须要在方法里去触发
public void Issue(string magazineName)
{
OnPublish(new PubEventArgs(magazineName));
}
}
// Subscriber 订阅者
public class LiJie
{
// 对事件感兴趣的事情
public static void Receive(object sender, PubEventArgs e)
{
Console.WriteLine("我已经收到最新一期的《" + e.magazinName + "》啦!!!!");
}
}
public class MrChen
{
// 对事件感兴趣的事情
public static void Receive(object sender, PubEventArgs e)
{
Console.WriteLine("我陈老师也收到最新一期" + e.magazinName + "书");
}
}
// 实际做事的人,被命令的人,去做事,,是下属
public class Subordinate
{
// 要做事的人 下属
public void DoSomething()
{
Console.WriteLine("下属1:老板叫我去干活了!!!!");
}
}
public class Subordinate2 {
public void DoSomething()
{
Console.WriteLine("下属2:老板,也叫我去干活了");
}
}
// 我是老板,,,我发布命令,委托在我身上实现
public class Boss
{
// 我得 声明个委托先 这里的参数和返回类型必须和 做事的人的函数一致
public delegate void DoSomethingEventHandler();
// 建立一个叫人干活的命令 事件 而事件必须要在 方法 去触发
public event DoSomethingEventHandler OnOrder;
public void OrderEvent()
{
if (OnOrder !=null)
{
Console.WriteLine("我要你们去干活了!!");
OnOrder();
}
}
public void Order()
{
// 里就是具体阐述这个命令是干什么的
DoSomethingEventHandler myDelegate = new DoSomethingEventHandler(new Subordinate().DoSomething);
myDelegate();
}
}
}