2010-07-12 4 views
1

하나의 오브젝트가 수신 한 호출을 다른 오브젝트로 전달하는 데 복합 패턴을 사용하고 싶습니다.다른 유형의 오브젝트를 가진 복합 패턴

현재 수신단의 객체는 모두 Abstract 유형이지만, 구체적 유형에 따라 매개 변수로 다른 유형의 objet를 선택적으로 허용한다는 점이 다릅니다 (다른 모델로 생각하십시오). 내가 볼 수있는

는 지금까지, 두 가지 솔루션이 있지만 어느 쪽도 만족 :

  • 사용이 instanceof를 입력 측의 클래스 형의 물체를 감지 할 수 있습니다. 이것은 종종 나쁜 습관이라고합니다.
  • 많은 입력 유형으로 을 만듭니다. 이는 List이 새로운 입력 유형을 수용하기 위해 추가되어야하고 각 List이 차례대로 명시 적으로 처리되어야한다는 문제점을 야기합니다.

저는 인터페이스 측면에서 생각해 왔지만 아직 실현 가능한 아이디어를 내놓지 않았습니다. 이 설계 문제에 대한 해결책은 무엇입니까? 합성물은 전혀 적합합니까?

P.S : 이것은 mvc의 컨텍스트에 있습니다.

답변

3

복합 패턴을 사용하면 리프 개체와 동일한 개체 컬렉션을 처리 할 수 ​​있습니다.

난 당신이 같은 일을 할 수 있다고 말하고 싶지만 : 복합이 나에게 어떤 의미인지의

public interface Command 
{ 
    void execute(Object parameter); 
} 

public class LeafCommand implements Command 
{ 
    public void execute(Object parameter) 
    { 
     // do something for a leaf 
    } 
} 

public class CompositeCommand implements Command 
{ 
    private List<Command> commands; 

    void execute(Object parameter) 
    { 
     for (Command child : commands) 
     { 
      child.execute(parameter); 
     } 
    } 

} 

합니다. 맞습니다. instanceof을 잘못 사용해야합니다.

+0

예, 그렇기 때문에 합성물도 볼 수 있습니다. 필자가 묘사 한 것에 대해 커맨드 객체의 타입에 따라 Command 객체를 무시하도록하는 방법이 될 것입니다. 객체는 여전히 같은 메소드를 사용하여 전달되지만'Command' 내부에서'instanceof'를 사용하도록 되돌려줍니다. –

+0

구체적인 클래스 내에 여러 개의 오버로드 된 메서드 서명과 해당 구현을 포함 할 수 있습니다. 그게 당신이 필요로하는 것을 할 수 없습니까? – duffymo

+0

글쎄, 그것에 대해 생각하고, 내가 뭘하려고하는지 그 크기에 따라 항목을 분리하는 공장에서 사용되는 선택 프로세스와 아이디어가 비슷합니다 (체 생각하세요). 다른 오버로딩 된 메소드가 이상적이지만 약간의 유연성을 허용 할 수있는 Object 유형이 장애물입니다. 어쩌면 나는 너무 열심히 생각하고 있고 더 간단한 접근법이있다. 내가 생각한 또 다른 것은 ClassCastException을 무시하고 참조가 null이 아닌 경우에만 작업을 수행하여 객체를 캐스팅 할 가능성이 있다는 것입니다. –

0

Java Practices의 StocksMonitor 애플리케이션에서 다음 접근법을 발견했습니다. 이것은 MVC 컨텍스트 메인 뷰의 갱신 방법 :

public void update(Observable aObservable, Object aData) { 
    fLogger.fine("Notify being broadcast..."); 
    if (aObservable == fCurrentPortfolio) { 
     fLogger.fine("Notified by Current Portfolio..."); 
     synchTitleBarWithCurrentPortfolio(); 
    } 
    else if (aObservable == fGeneralLookPrefs) { 
     fLogger.fine("Notified by General Look..."); 
     synchGuiWithGeneralLookPrefs(); 
    } 
    } 

참조가 선택적으로 대응하는 뷰를 갱신하는데 사용되는 서로 다른 모델의 인스턴스이다. 이 접근법은 복합 패턴을 고려하며 매개 변수 인스턴스에 따라 사례별로 처리 할 수 ​​있습니다. 물론 이것은 런타임에 사용되는 모델의 한 인스턴스에만 의존합니다.

+0

또 다른 가능성은 문자열과 같은 일종의 식별자를 포함하는 사용자 지정 개체를 만드는 것입니다. 이것은 Object 매개 변수 대신 전송 될 수 있습니다. –

관련 문제