另一种思考事件,发布者/订阅者等的方式是思考云及其运作方式。在基于云的系统中,任何实体都可以注册以侦听任何类型的事件,或者可以发布任何它想要的事件。任何人在倾听,都会得到这些数据。
在您的示例中:出租车中央可以发布/推送事件,如轮班更改,交通事故(位置),出租车请求(位置)或其他类似的事情,整个出租车组将会听。个人出租车将出版诸如Pickup At(Location),Drop Off(Location),Accident at(Location);中央将为自己的目的登录。其他出租车可以,如果他们还想要听这些相同的事件,以便他们知道在哪里和如何接近其他出租车到他们自己的位置,或者如果有另一个驾驶室报告或类似的事故。
但云事件是事件系统的特定实现。它更常见于特别订阅事件。驾驶室对象在创建时会立即订阅中央事件,而派遣驾驶室时的中央系统将确保它自己订阅该出租车的事件。
这样,两个对象都起到发布者和订阅者的作用。它只针对单个事件。在我的示例中,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
简单事件代码,主要支持这一活动。当代码从任何地方调用x.OnDoStuff()
时,如果您将x或其引用传递到实际代码被处理的其他类中,这非常方便,然后处理程序返回主程序,无论调用x.OnDoStuff()
多少层起源于,将执行。
确切地说,一旦创建了X,它就可以被传递到其他地方。只要某些功能分配给x.DoStuff
,无论您何时何地调用方法x.OnDoStuff()
,都将执行分配给x.DoStuff
的功能。这就是事件订阅的工作方式。 x.OnDoStuff()
是发布事件x.DoStuff
的代码调用,以及任何类...实际上任何数量的类,你都可以拥有多个订阅者,将能够捕获已发布的事件。
感谢您的解释!我想如果我还必须使用WPF窗口,它会更加复杂。出租车中央是主窗口,所有的出租车都有用于说明目的的用户窗口。那么我必须在小步骤中完成 – 2012-08-08 16:43:39
在我的指导中,我将定义三个EventArgs信息类,它们是从EventArgs派生的?我不确定那是什么意思?从EventArgs派生的部分? – 2012-08-08 16:56:50
是这个家庭作业?如果是这样,请添加作业标签。您似乎有一组相当具体的要求... EventArgs是EventHander用来将参数传递到订阅者函数的通用类。通过创建该类的自定义实现,您可以让事件发布比“DoStuff”更多的特定数据。您可以在“OnDoStuff”发布呼叫中填充此数据。 – Nevyn 2012-08-08 17:03:41