不理解代表/事件和发布者/订阅者的观点
本文关键字:观点 事件 不理解 发布者 | 更新日期: 2024-11-05 11:56:01
我正在阅读和阅读,但我仍然无法理解重点以及如何使用代表/事件和发布者/订阅者?我知道委托是一个包含对一个或多个方法的引用的类,它用于将方法发送到另一个方法。
我不明白的是我应该如何确定发布者/suubscriber的角色。让我们举个例子。出租车中心和出租车。出租车中心是公共公司,出租车是订户,从出租车中心获得驾驶订单是什么?但是出租车也可以是出版商,并报告那里的位置和他们要去的地址给出租车中心,然后是出租车的订户!?
我需要灵感,我正在寻找初学者代码来了解它是如何工作的。是否有人有几分钟的时间用一些简单的代码回复这个答案?谢谢!
另一种思考事件、发布者/订阅者等的方式......是考虑云及其运行方式。 在基于云的系统中,任何实体都可以注册以侦听任何类型的事件,或者可以发布它想要的任何事件。 任何倾听的人都会得到这些数据。
在您的示例中:出租车中心可以发布/推送事件,例如换班、交通事故作为(位置)、在(位置)请求出租车或整个出租车组将侦听的其他类似内容。 各个出租车将发布诸如在(位置)取货,在(位置)下车,在(位置)发生事故之类的内容;中央将出于自己的目的进行日志记录。如果其他出租车也想监听这些相同的事件,他们可以知道其他出租车离他们自己的位置和距离,或者是否有另一辆出租车报告的事故或类似情况。
但是,云事件是事件系统的特定实现。 专门订阅事件更为常见。 cab 对象在创建时将立即将自身订阅到 Central 事件,并且中央系统在调度 cab 时将确保它订阅了该 cab 的事件。
这样,这两个对象都充当发布者和订阅者的角色。 它只真正特定于单个事件。 在我的示例中,PickupAt(Location)
将由 Cab 发布,并由 Central 订阅。 因此,对于该事件,Cab 是发布者,Central 是订阅服务器。 一般来说,谁担任什么角色完全取决于系统设计和正在创建的事件。 它不是真正可以概括的东西,因为如果您以不同的方式设置事件,整个设置可能会更改甚至逆转。 我认为这是最重要的部分。
全体代表
用最简单的术语来说,委托是一个引用。 它可以引用类,更常见的是它可以引用类中的方法,或者调用类中的方法。 它甚至可以在自身内部包含整个方法调用。 它真的是一个非常通用的对象,因为它可以做很多事情。 在事件的上下文中,委托实际上引用对实现事件的函数的调用。
简单事件代码
public class c1
{
public event Eventhandler DoStuff;
public c1()
{
}
public void OnDoStuff()
{//this actually makes the event happen
if (DoStuff != null)
DoStuff(this, null);
}
}
public static void Main()
{
c1 x = new c1();
x.DoStuff += new EventHandler(ThingFunction);
x.OnDoStuff();//this is how you would fire the event deliberately
}
public void ThingFunction(object sender, EventArgs x)
{
Console.WriteLine("Something Happened");
}
c1 包含事件DoStuff
,Main 订阅此事件。当代码从任何地方调用x.OnDoStuff()
时,如果将x或对它的引用传递到处理实际代码的其他类中,这将非常方便,那么无论x.OnDoStuff()
调用来自多少层,都将执行主中的处理程序。
更具体地说,一旦创建了X,就可以将其传递到其他地方。 只要将某个函数分配给x.DoStuff
,无论何时何地调用方法x.OnDoStuff()
,分配给x.DoStuff
的函数就会执行。 这就是事件订阅的工作方式。 x.OnDoStuff()
是发布事件x.DoStuff
的代码调用,以及任何类...事实上,任意数量的类,毕竟可以有多个订阅者,将能够捕获已发布的事件。
你必须用"事件驱动"的术语来思考。在您的示例中,taxicentral 和 cab 可能有发布者角色,出租车中心和出租车可能有订阅者角色。
例如,如果 taxicenter 有一个更新要推送到所有出租车,它可以有一个引发的事件,出租车会侦听。然后,出租车可以在接送某人时提出一个事件,出租车中心将听取所有这些事件。
这有帮助吗?
委托不用于将方法发送到其他方法。它们用于调用方法,这些方法在编译时可能是未知的。
让我们看一个简单的例子。考虑一下,您编写了一个计算器,用户可以在其中选择参数和操作。该操作可以是执行计算的方法的委托。因此,您不必担心如何存储操作。此外,计算器不需要知道每个操作,因为用户会提供它。
委托的一个常见示例是回调函数。如果在第二个线程中启动长期过程,则在线程已完成时,您可能希望收到通知。可以通过在过程完成后向调用的线程提供委托来执行此操作。
事件是一种特殊类型的代表。当对象想要通知其他人状态更改或类似操作时,将使用它们。关于这一点的特殊之处在于,对象本身不需要知道哪些对象对更改感兴趣。相反,这些对象订阅事件。提供事件的对象只需调用事件的委托,并调用所有订阅者委托。
正如Justin C已经解释的那样,出租车中心和出租车都可以充当订阅者和发布者。这取决于谁对什么感兴趣。如果每个人都被允许订阅活动。如果只允许出租车中心获取信息,则回调方法将更合适。