类之间双向通信的最佳模式是什么?

时间:2010-12-14 09:07:42

标签: .net design-patterns

我的课程需要彼此沟通。问题是,如果你让一个包含另一个(子父关系),那么事情变得棘手。您需要将父项的实例传递给子项(如果使用依赖项注入,则首先创建哪一项),或者可以使用委托/事件。但我想强制执行父母必须能够处理孩子提出的事件这一事实。不太确定如何做到这一点。我也不想要多个订阅者参加活动。

亲子关系对于双向沟通感觉不对。不幸的是,不是一个对象总是启动而另一个响应的情况。要么可以启动,要么另一个应该响应。

我还缺少另一种模式吗?

更新: 对不起,这很难解释。我忘了添加,当一个类向另一个类发送消息时,它不会立即期望响应。响应以异步方式进行,这就是为什么要么需要父实例来调用正确的方法,要么需要委托/事件。对不起,下面的示例是伪代码。希望这足以得到这个想法。我应该看看调解员模式。

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
        }
    }

5 个答案:

答案 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);