2010-08-04 5 views
1

안녕하세요! 나는 상대적으로 GWT와 자바 프로그래밍 (또는 OOP 그 문제에 대한) 새로운, 그래서 초보자 질문/실수에 대한 사전 사과. 어떤 종류의 관찰자 패턴을 만들려고 노력했지만 개발 모드 콘솔은 오류 메시지를 계속 표시하고 슬프게도 도움이되지 않습니다.GWT의 옵저버 패턴

그래서 여기에 내가 얻으려는 것이있다 : - 나는 Country 클래스로 구성된 모델을 가지고 있으며 Influence라는 값을 저장한다. -보기는 CountryDisplay라는 클래스입니다. 주어진 국가의 현재 영향을 항상 표시해야하는 GWT 위젯입니다.

public class Country { 
    private int influece; 
    private CountryDisplay display; 

    public Country() { 
     influence = 0; 
    } 
    public void setDisplay(CountryDisplay display) //... 
    public int getInfluence() //... 
    public void setInfluence(int value) { 
     influence = value; 
     display.update(); 
    } 
} 
public class CountryDisplay { 

    private Country country; 

    public CountryDisplay (Country country) { 
     //GWT widget creating stuff 
     this.country = country; 
    } 
    public void update() { 
     //InfluenceCounter is a simple Label 
     InfluenceCounter.setText(Integer.toString(country.getInfluence())); 
    } 
} 

은 그 다음의 EntryPoint 클래스에서 나는 같은 것을 할 :

Country italy = new Country(); 
CountryDisplay italyDisplay = new CountryDisplay(italy); 
italy.setDisplay(italyDisplay); 
RootPanel.get("nameFieldContainer").add(italyDisplay); 
italy.setInfluence(3); 

개발 콘솔은이 라인에 문제가 있다고 표시 "display.update를();" Country 클래스에서. 내 첫 번째 추측은 디스플레이가 시작되지 않았다는 것이 문제 였기 때문에 인터페이스를 만들었고 국가 생성자에서 비어있는 새 디스플레이를 만들어 나중에 덮어 쓰게되었습니다.

public Country() { 
     influence = 0; 
     display = new DisplayInterface() { 
      public void update() {} 
     } 
    } 

하지만 나는 이런 식으로도 운이 없었습니다. 이런 상호 참조는 허용되지 않는 것 같네요? 뷰가 변수로 모델을 가지고 있고 그 반대의 경우도 마찬가지입니다. 개별적으로보기에 메소드를 호출하면 (같은 :

italy.setInfluence(3); 
italyDisplay.displayTheCurrentValue(); 

을)이 작동하므로 문제가 관찰자의 논리에 확실히이다.

+0

원본 코드가 괜찮은 것 같습니다. 'update'를 호출 할 때'display' 필드가 올바르게 초기화되었는지 확신합니까? 확실하게'display.update()'를 호출하기 직전에 디버깅 포인트 (log /'Window.alert')를 추가하는 편이 낫다. (또한'null'로 초기화된다.) 또 다른 가능한 함정 :'setDisplay' 메쏘드는'display'를 매개 변수로 사용합니다 - 당신은 그것이 표시 필드를 막지 않는 것이 확실합니까? – adamk

+0

와우, 멋진 캐치 adamk. 원래 코드에서 저는 여기에서했던 것처럼 영향력 값을 설정하는 대신 Country 생성자에서 setInfluence 메서드를 사용했습니다. 그리고 초기화 전에 그것을 수행했습니다. 이제 나는 처음에 그 질문을 부끄러워했다. 감사합니다. 답변을 게시 할 수 있도록 허용합니다. –

+0

질문에 대한 답변이 아니지만 코드가 GWT 팀이 GWT의 다음 버전에서 소개하는 MVP 패턴과 매우 유사하게 보입니다. 아마도 http://code.google.com/webtoolkit/articles/mvp-architecture.html을 살펴 보길 원할 것입니다. 그것은 많은 것들을 명확하게 단순화합니다! – monzonj

답변

0

올바르게 이해하면 사용자 인터페이스 요소 (보기 클래스 CountryDisplay)를 모델 클래스 (모델 클래스 Country)에 "바인딩"하려고합니다. 모델 데이터 (예 : italy.setInfluence(10))를 변경하면 뷰가 자동으로 변경되어 변경 사항을 반영한다는 의미에서 "바인딩"합니다. 보기에 편집기가 제공된 경우 "바인딩"이 다른 방향으로 작동되기를 원합니다.

여기에는 몇 가지 프레임 워크가 있습니다 (예 : 게시 Best data binding solution for GWT 참조). 나는 GWT Pectin을 사용했으며 GWT Editors framework (비교적 새로운 것으로서 나는 아직 자신을 사용하지 않았다)이있다.

코드를 보면보기와 모델을 더 명확하게 구분할 수 있습니다. 모델 클래스 (Country)는보기 클래스에 대해 알 필요가 없습니다. 즉, CountryDisplay에 대한 참조를 저장해서는 안됩니다.