我的课程需要彼此沟通。问题是,如果你让一个包含另一个(子父关系),那么事情变得棘手。您需要将父项的实例传递给子项(如果使用依赖项注入,则首先创建哪一项),或者可以使用委托/事件。但我想强制执行父母必须能够处理孩子提出的事件这一事实。不太确定如何做到这一点。我也不想要多个订阅者参加活动。
亲子关系对于双向沟通感觉不对。不幸的是,不是一个对象总是启动而另一个响应的情况。要么可以启动,要么另一个应该响应。
我还缺少另一种模式吗?
更新: 对不起,这很难解释。我忘了添加,当一个类向另一个类发送消息时,它不会立即期望响应。响应以异步方式进行,这就是为什么要么需要父实例来调用正确的方法,要么需要委托/事件。对不起,下面的示例是伪代码。希望这足以得到这个想法。我应该看看调解员模式。
public class Foo
{
public void SendMessageAToBar()
{
MessageA msg = new MessageA();
Bar.ReceiveMessageAFromFoo(msg);
}
public void ReceiveMessageARespFromBar(MessageAResp msgResp)
{
//Got a response do something
}
public void ReceiveMessageBFromBar(MessageB msg)
{
//Do something msg
MessageBResp msgBResp = new MessageBResp();
Bar.ReceiveMessageBRespFromFoo()
}
}
public class Bar
{
public void ReceiveMessageAFromFoo(MessageA msg)
{
//DO something.
MessageAResp resp = new MessageAResp();
Foo.ReceiveMessageARespFromBar(resp);
}
public void SendMessageBToFoo()
{
MessageB msg = new MessageB();
Foo.ReceiveMessageBFromBar(msg);
}
public void ReceiveMessageBRespFromFoo(MessageBResp msgResp)
{
//Got a response do something
}
}
答案 0 :(得分:2)
提供一个好的答案有点困难,因为你的问题有点抽象。 但是,Mediator模式呢?
答案 1 :(得分:1)
也许你应该使用一个引导程序:
class Main
{
void Main(...)
{
A a = new A();
B b = new B();
a.MessagePosted += (sender, messageArgs) => b.ReadMessage(messageArgs.Message);
b.MessagePosted += (sender, messageArgs) => a.ReadMessage(messageArgs.Message);
}
}
现在,A和B都幸福地彼此没有意识到。
答案 2 :(得分:1)
创建一个包含通信详细信息的中间对象,并将其注入A和B?
答案 3 :(得分:0)
您可能需要查看Udi Dahan的Domain Events Pattern和代码示例。它与Chad发布的代码片段具有相同的基本原则。 Martin Fowler还撰写了有关该模式的文章,并提供了有关该主题的更多信息。
答案 4 :(得分:0)
这是一个例子,也可以使用Interfaces来完成。
public abstract class Attachable
{
public void Attach(Attachable attachable)
{
Attached = attachable;
attachable.Attach(this);
}
public Attachable Attached { get; private set; }
public abstract void DoSomethingUseful(object argument);
}
public class A : Attachable
{
#region Overrides of Attachable
public override void DoSomethingUseful(object argument)
{
// do something useful
}
#endregion
}
public class B : Attachable
{
#region Overrides of Attachable
public override void DoSomethingUseful(object argument)
{
// do something useful
}
#endregion
}
// Usage
A a = new A();
B b = new B();
a.Attach(b);