클래식 Observer 패턴 인터페이스를 정의하는 두 개의 추상 클래스 Subject와 Observer를 만들었습니다. Observer 패턴을 구현하기 위해 그것들에서 파생됩니다. 관찰자는 다음과 같이 보일 수 있습니다.
void MyClass::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
이것은 괜찮으며 누가 무언가 를 바꿨 는지 알려줍니다 . 그러나 무엇이 바뀌 었는지 알려주지 않습니다 . 주제에 최신 데이터를 쿼리하기 때문에 때로는 괜찮습니다.하지만 다른 경우 주제에 정확히 무엇이 바뀌 었는지 알아야합니다. Java에서 변경 사항에 대한 세부 정보를 지정하기 위해 notifyObservers () 메소드와 notifyObservers (Object arg) 메소드를 모두 가지고 있습니다 .
제 경우에는 두 가지 다른 동작 중 하나가 주제에 대해 발생했는지, 특정 조치 인 경우 해당 동작과 관련된 정수를 알아야합니다.
그래서 내 질문은 :
- Java와 마찬가지로 일반적인 인수를 전달하는 C ++ 방법은 무엇입니까?
- 관찰자가 가장 좋은 패턴입니까? 아마도 어떤 종류의 이벤트 시스템일까요?
최신 정보
Observer 패턴을 템플릿 화하는 방법에 대해 설명하는이 기사를 찾았습니다. 템플릿 으로 Subject / Observer 패턴 구현 . 이것은 당신이 인수를 템플릿 할 수 있는지 궁금해했습니다.
인수를 템플릿 화하는 방법에 대한이 스택 오버플로 질문을 발견했습니다. 템플릿 기반 주제 관찰자 패턴-static_cast 또는 dynamic_cast 사용해야 합니다. 그러나 OP에는 아무도 대답하지 않은 문제가있는 것 같습니다.
내가 할 수있는 다른 일은 다음과 같이 Update 메소드를 변경하여 EventArg 객체를 가져 오는 것입니다.
void MyClass::Update(Subject *subject, EventArg arg)
{
...
그런 다음 특정 인수 데이터에 대해 EventArg의 하위 클래스를 만든 다음 업데이트 메소드 내의 특정 하위 클래스로 다시 캐스트합니다.
업데이트 2
또한 비동기 메시지 기반 c ++ 프레임 워크 작성 기사를 찾았습니다 . 2 부 제목을 가진 나와있는가에 대한 세부 정보 통신 무엇을 변경합니다.
나는 Boost.Signals 사용을 진지하게 고려하고 있습니다 . 내 자신의 옵저버 패턴을 사용하는 것이 간단했을 때 의미가 있었지만 타입과 템플릿을 템플릿 화하는 것은 복잡해지기 시작했습니다. 그리고 Boost.Signals2의 스레드 안전성이 필요할 수 있습니다.
업데이트 3
또한 관찰자 패턴에서 흥미로운 기사를 발견했습니다.
그러나 Boost.Signals를 사용하여 구현을 전환했지만 아마도 내 목적으로 부풀어 오를 수 있지만 성공적으로 작동합니다. 그리고 아마도 팽창이나 속도에 대한 우려는 무의미합니다.