不了解代表/活动和发布者/订阅者的观点

时间:2012-08-08 15:35:29

标签: c#

我正在阅读和阅读,但我仍然无法明白这一点以及如何使用代表/活动和发布者/订阅者?我知道委托是一个包含对一个或多个方法的引用的类,并且它用于将方法发送到另一个方法。

我不知道的是我应该如何确定publischer / suubscriber的角色。我们来举个例子吧。一个taxicentral和它的出租车。作为发布者的出租车公司和出租车公司的订户,是否想要从公共租赁公司获得订单?但出租车也可以是出版商,并报告那里的位置和他们前往的税务地址,然后是出租车的订户!?

我需要灵感,我正在寻找som初学者代码来了解这是如何工作的。是否有人有一些时间用一些简单的代码回复这个答案?谢谢!

3 个答案:

答案 0 :(得分:2)

考虑事件,发布者/订阅者等的另一种方式是考虑云及其运行方式。在基于云的系统中,任何实体都可以注册以侦听任何类型的事件,或者可以发布它想要的任何事件。任何人都在倾听,会获得这些数据。

在您的示例中:出租车中心可以发布/推送诸如班次变更,交通事故(位置),在(位置)请求的出租车或整个出租车组将要收听的其他类似事件之类的事件。个别出租车将发布诸如Pickup At(位置),Drop Off at(Location),Accident at(Location)等内容;中央将为自己的目的登录。其他出租车如果他们也想听这些相同的事件,那么他们就会知道其他出租车到他们自己的位置的位置和距离,或者是否有其他驾驶室报告的事故或类似情况。

然而,云事件是事件系统的特定实现。特别订阅事件更常见。 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订阅此事件。当代码从ANYWHERE调用x.OnDoStuff()时,如果你将x或它的引用传递给处理实际代码的其他类,这非常方便,那么处理程序的方式将返回main,无论多少层x.OnDoStuff()来电的深度来自,将执行。

更具体地说,一旦创建了X,它就可以传递到其他地方。只要将某个函数分配给x.DoStuff,无论何时何地调用方法x.OnDoStuff(),都将执行分配给x.DoStuff的函数。这就是事件订阅的工作方式。 x.OnDoStuff()是发布事件x.DoStuff的代码调用,任何类......实际上任意数量的类,毕竟你可以拥有多个订阅者,能够捕获已发布的事件。 / p>

答案 1 :(得分:0)

你必须考虑“事件驱动”术语。在您的示例中,可能有taxicentral和cabs的发布者角色以及taxicentral和cab的订阅者角色。

例如,如果taxicentral有更新推送到所有出租车,它可能会有一个事件,它会提升并且出租车会听。然后出租车可以在他们接载和放下某人时举起他们举办的活动,而且税务局会听取所有这些事件。

这有帮助吗?

答案 2 :(得分:0)

委托不用于将方法发送到其他方法。它们用于调用方法,这些方法在编译时可能是未知的。

让我们看一个简单的例子。考虑一下,你编写一个计算器,用户可以在其中选择参数和操作。该操作可以是执行计算的方法的委托。因此,您不必担心如何存储操作。此外,计算器不需要知道每个操作,因为用户将提供它。

委托的一个常见示例是回调函数。如果您在第二个线程中启动长期过程,则可能希望在线程完成时收到通知。您可以通过在过程完成时为调用的线程提供委托来完成此操作。

事件是一种特殊类型的代理。当对象想要通知其他人状态更改或类似操作时,使用它们。关于这一点的特殊之处在于对象本身不需要知道哪些对象对更改感兴趣。相反,这些对象订阅该事件。提供事件的对象只需要调用事件的委托,并调用所有订阅者委托。

正如Justin C已经解释的那样,出租车中央和出租车都可以充当订户和出版商。这取决于谁对什么感兴趣。如果允许每个人订阅这些活动。如果只允许出租车中心获取信息,则回调方法更合适。