2010-12-14 5 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); 
    } 
} 

을, A와 B 둘은 서로 행복하게 모르고있다.

+0

문법을 좋아한다! –

0

Domain Events Pattern과 코드 샘플을 Udi Dahan이보고 싶을 수도 있습니다. Chad가 게시 한 코드 스 니펫과 기본 원칙이 동일합니다. 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

관련 문제