2

我正在阅读和阅读,但我仍然无法理解以及如何使用委托/事件和发布者/订阅者?我知道委托是一个包含对一个或多个方法的引用的类,它用于将方法发送到另一个方法。

我不明白的是我应该如何确定发布者/订阅者的角色。让我们举个例子。出租车中心和出租车。出租车中心是出版商,出租车是订阅者,从出租车中心获得驾驶命令是什么?但是出租车也可以是发布者,然后向出租车中心报告他们要去的位置和地址,那么是出租车的订阅者!?

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

4

3 回答 3

2

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

在您的示例中:出租车中心可以发布/推送事件,例如换班、交通事故作为(位置)、出租车请求在(位置)或整个出租车组将监听的其他类似事件。各个出租车将发布诸如 Pickup At (Location)、Drop off at (Location)、Accident at (Location) 等信息;该中央将出于自己的目的进行记录。如果其他出租车也想监听这些相同的事件,那么他们可以知道其他出租车与他们自己的位置之间的距离和距离,或者是否有其他出租车报告的事故或类似情况。

然而,云事件是事件系统的特定实现。专门订阅事件更为常见。cab 对象在创建时会立即订阅 Central 事件,而中央系统在调度 cab 时会确保它自己订阅了该 cab 的事件。

这样,两个对象都充当发布者和订阅者的角色。它仅针对单个事件。在我的示例PickupAt(Location)中,将由出租车发布,并由 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()从 ANYWHERE 调用时,如果您将 x 或对它的引用传递到其他处理实际代码的类中,这将非常方便,然后处理程序返回 main,无论x.OnDoStuff()调用源自多少层, 将执行。

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

于 2012-08-08T16:21:18.893 回答
0

你必须用“事件驱动”的术语来思考。在您的示例中,出租车中心和出租车可能有发布者角色,出租车中心和出租车可能有订阅者角色。

例如,如果出租车中心有一个更新要推送到所有出租车,它可以有一个它引发的事件并让出租车监听。然后,出租车可以在接送某人时提出一个事件,出租车中心会监听所有这些事件。

这有帮助吗?

于 2012-08-08T15:38:49.943 回答
0

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

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

委托的一个常见示例是回调函数。如果您在第二个线程中启动长期程序,您可能希望收到通知,如果线程已完成。当过程完成时,您可以通过向被调用的线程提供一个委托来实现这一点。

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

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

于 2012-08-08T15:49:05.033 回答