当objectA想要向objectB发送消息时,该方法应该在哪里生效?

时间:2016-02-20 03:59:06

标签: java c++ extensibility maintainability

假设您创建了两个对象:objectA和objecB。如果objectA需要向objectB发送消息,它应该是这样的:

objectA.theMessage(objectB)

或者像这样:

objectB.theMessage(objectA)

更具体的例子:

Publisher p;
Subscriber s;

// way 1
p.addSubscriber(s);

// way 2
s.subscribeTo(p);

正如您所看到的,两个messeges(函数)的语义都是相同的,它只是函数应该存在的位置。

是否存在一条强硬的规则,说明应该做哪些事情?或者是否有一般指导方针可以帮助您确定哪种设计更好?或者这是一个案例的事情,没有一般的指导方针存在?如果是这样,你能解释我什么时候使用它们。你能想到每个潜在的优点/缺点吗?

非常感谢您的时间和知识!

1 个答案:

答案 0 :(得分:2)

这里的区别在于您是喜欢推模式还是拉模式。哪一个更适合在很大程度上取决于应用程序。 “推送”基本上意味着A发送B消息,而“拉”意味着BA获取消息。

如上所述,没有一般规则,但通常人们可以用常识回答这个问题。举一个例子:今天早上我的家人和我吃早餐。在此之前,我不得不开车去面包店买面包(这是在德国,我们喜欢我们的Brötchen)。另一方面,我在早餐时看到的报纸来自纸质送货员。这个设置是合适的:我是谁想要面包面包所以我做了一些工作以获得它们,但我可能会懒得出去买报纸(除非可以在面包店获得)。另一方面,如果面包馒头已经交付而且报纸没有送出,我最终会得到更贵的包子而且没有报纸。愚蠢的例子结束。

那么,这对您的设计意味着什么?必须需要将邮件从A发送到B的人会触发它。根据我的经验,这通常是接收器,这就是为什么拉模式通常是第一选择(同样,它允许更容易进行懒惰评估 - 只在真正需要时获取消息)。但正如所说,它实际上取决于应用程序。做出选择: - )