2010-12-14 1 views
5

У меня есть классы, которые должны общаться друг с другом. Проблема в том, что если вы создаете один из них, то другой (дочерние родительские отношения), тогда все становится сложным. Вам либо нужно передать экземпляр родителя в дочерний элемент (затем какой из них вы создаете первым, если используете инъекцию зависимостей), либо вы можете использовать делегаты/события. Но я хочу подчеркнуть тот факт, что родитель должен иметь возможность обрабатывать событие, которое повышает ребенок. Не слишком уверен, как это сделать. Я также не хочу использовать несколько подписчиков.Каков наилучший шаблон для двухсторонней связи между классами?

Отношения между родителем и ребенком просто чувствуют себя неправильно для двусторонней коммуникации. К сожалению, это не тот случай, когда один из объектов всегда инициируется, а другой отвечает. Любой может начать, а другой должен ответить.

Есть ли другой шаблон, который мне не хватает?

ОБНОВЛЕНИЕ: Простите, это довольно сложно объяснить. Я забыл добавить, что, когда один класс отправляет сообщение другому классу, он не ожидает ответа немедленно. Ответ приходит асинхронно, поэтому вам нужен экземпляр родителя для вызова правильного метода или делегата/события. Извините, пример ниже - псевдокод. Надеюсь, этого достаточно, чтобы понять эту идею. Должен ли я взглянуть на шаблон посредника.

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

Что нового в этом случае означает, что вы не хотите использовать события здесь? –

+0

Можете ли вы добавить примеры кода для ребенка и родителя? – jgauffin

+0

Возможно, это поможет, если вы опишете, какие фактические объекты вы имеете в виду как родители и дети. Это не всегда плохо, если у ребенка есть ссылка на родителя. Существует много случаев, таких как TreeView, XmlNode и т. Д., А также использование Observer - очень жизнеспособный вариант. Не уверен, почему вы говорите: «Я также не хочу, чтобы несколько подписчиков на мероприятие». Не могли бы вы это объяснить? –

ответ

2

Немного сложно дать хороший ответ, так как ваш вопрос немного абстрактный. Но, как насчет модели Mediator?

+0

Я только что наткнулся на шаблон посредника. Я сейчас смотрю на это. :) – uriDium

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

Теперь, как А и В блаженном неведении друг от друга.

+0

Любите синтаксис! –

0

Возможно, вы захотите посмотреть на Domain Events Pattern и образец кода Udi Dahan. Он имеет тот же базовый принцип, что и фрагмент кода, опубликованный Чадом. Martin Fowler также написал о шаблоне и предоставляет немного больше информации по этой теме.

0

Это пример, который также может быть выполнен с использованием интерфейсов.

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); 
+0

Не совсем уверен, как это сработает. Можете ли вы уточнить? – uriDium

+0

См. Мое обновление (использование). Каждый может вызвать DoSomethingUseful другого (который вы меняете для своей цели), и они могут общаться. – Aliostad

1

Сделайте промежуточный объект, который содержит информацию о связи и вводит его как в A, так и в B?

+0

Это похоже на шаблон посредника. Еще не закончил читать. Дам вам знать. – uriDium

+0

Да, спасибо, что указали это.http://en.wikipedia.org/wiki/Mediator_pattern в значительной степени описывает ваше дело. – Grozz

+0

Итак, являются ли «посредником» и «загрузчиком» в основном то же самое? – Chad