3

OO 시스템을 처음 사용했습니다. 간단한 플래시 카드 응용 프로그램을 사용하여 시스템을 설계하는 올바른 방법을 찾지 못했습니다. 응용 프로그램에는 질문, 답변 및 커플 단추가있는 간단한 GUI가 있습니다. 질의 및 응답 데이터 세트는 Derby 내장 데이터베이스에 저장됩니다.응용 프로그램 아키텍처 질문

빠른 설치 :
이 데이터베이스 클래스 - 연결, 해제를 처리하고, (현재 CardSet 객체에 의해 호출) 선택된 필터를 기반으로 ArrayList에를 반환합니다 (DB 클래스는 정적을 설정)
CardSet 클래스 - , ArrayList에 현재 사용중인 보유하고있는 현재의 카드를
카드 클래스를 보유 -하여 플래시 카드 데이터 (질문과 답변, 몇 가지 다른 것들)
앱 등급 보유 - GUI를 생성하고 처리하는 액션 이벤트 그래서

여기 내 질문 : 나는 GUI와 응용 프로그램 로직을 분리하고 싶다. 나는 그것이 MVC를위한 좋은 사례일지도 모른다라고 생각하고있다. 그러나 나는 정말로 그것 (결코 그것을 사용하지 않았던 누구나)을 어떻게 분리해야하는지 명확하지 않다. main에서 컨트롤러 클래스를 생성 한 다음 GUI를 시작한 다음 다른 클래스 (내 경우에는 CardSet)를 만듭니다. 접근은 어떨까요? 어떤 것들은 정적 일 필요가 있습니까?

다른 질문 - GUI 이벤트를 처리하기 위해 컨트롤러 클래스에서 일반적인 메서드를 호출하도록 설정 했습니까? 예를 들어, controller.nextCardAction()과 같은 것을 호출해야한다면 "Next Card"버튼을 클릭 할 것인가? GUI에서 데이터를 가져 오려면 Observer 패턴을 사용해야합니까?

초급 질문으로 불편을 끼쳐 드려 죄송 합니다만, 자바 앱을 처음 사용하게되었습니다. 어떤 도움이라도 좋을 것입니다. 좋은 링크도 환영합니다. 나는 Head First Design Patterns 책을 가지고 있지만, 앱을 완전히 이해할 수있는 실제 예제가 충분하지 않습니다.

+0

GUI 용으로 SWT 또는 Swing을 사용한다고 가정하는 것이 안전합니까? – btreat

+0

GUI 스윙. 1 개의 메인 패널을 가지고있는 1 개의 메인 JFrame이 있는데, 3 개의 서브 패널을 가지고있는 메인 패널입니다. – Awaken

답변

1

다음은 매우 유용한 example and discussion입니다.

어디서 DB를 읽으시겠습니까?

내가 모델이 건설에 대한 몇 가지 기본값으로 초기화하고 컨트롤러는 사용자가 새로운 세트를 싶다고 할 때마다 그것을 보충, 현재 CardSet에 대한 참조를 유지하기 위해 기대

. CardSet만이 Card이 어디서 왔는지 또는 새 세트를 얻는 방법을 알고 있습니다. 사용자 작업에 대한 응답으로 뷰는 모델에 다음 또는 이전 카드를 요청하고 수신중인 모델에서 다시들을 때 업데이트합니다.

컨트롤러를 컨트롤과 혼동하지 마십시오.보기와 컨트롤러 모두 단추와 같은 컨트롤을 관리 할 수 ​​있습니다. 인용 된 example에는 컨트롤러에 재설정 버튼이 있고보기에는 일련의 게임 버튼이 있습니다. 응용 프로그램에서 컨트롤러는 세트 변경을 시작하고 뷰에는 세트의 카드간에 이동하는 컨트롤이 있습니다.

참조를 위해 MVC 다이어그램의 실선은 메서드 호출이며 점선은 수신기에 대한 콜백입니다. example 인용문에서 ObservableObserver 클래스는 update() 콜백을 제공하지만 EventListenerList 메커니즘도 일반적입니다.

+0

@Awaken : 귀하의 의견에 따라 답변을 업데이트했습니다. – trashgod

1

청취자 패턴을 조사하십시오.

"현재 플래시 카드"를 듣기 위해 GUI의 일부를 다시 작성하십시오. GUI를위한 코드는 다음과 같이 보일 것이다 :

public interface ModelListener { 
    public void modelChanged(); 
} 

public class FlashCardView implements ModelListener { 

    private FlashCard model; 

    public FlashCardView(FlashCard card) { 
    setModel(card); 
    } 

    public void setModel(FlashCard card) { 
    if (model != null) { 
     model.removeListener(this); 
    } 
    model = card; 
    model.addListener(this); 
    } 

    public void modelChanged() { 
    (read out model values and update the screen displayed values) 
    } 

} 

public interface Model { 
    public void addListener(ModelListener listener); 
    public void removeListener(ModelListener listener); 
} 

public class FlashCard() { 

    private String answer; 

    private String question; 

    private Vector<ModelListener> listeners; 

    public FlashCard(String question, String answer) { 
    this.question = question; 
    this.answer = answer; 
    this.listeners = new Vector<ModelListener>(); 
    } 

    public void setAnswer(String newAnswer) { 
    this.answer = newAnswer; 
    } 

    public void setQuestion(String newQuestion) { 
    this.question = newQuestion 
    } 

    public void addListener(ModelListener listener) { 
    listeners.add(listener); 
    } 

    public void removeListener(ModelListener listener) { 
    listeners.remove(listener); 
    } 

    private void notifyListeners() { 
    for (ModelListener listener : listeners) { 
     listener.modelChanged(); 
    } 
    } 

} 

는 "컨트롤러"클래스로 주어진 시간에 표시 할 버튼이 수행하는 작업을하고있는 "뷰"의 선택을 모두 넣습니다. 기본적으로 setModel(...) 메서드를 호출해야하며 현재 표시된 윈도우에서 "보기"클래스를 추가 및 제거해야합니다.

간단한 플래시 카드를 표시하는 데 약간의 코드처럼 보일 수도 있지만 플래시 카드보다 많은 모델이 더 복잡해집니다. 가까운 시일 내에 테스트, 주제 등을 표현하는 수업이 필요할 것입니다.

+0

자세한 답변을 보내 주셔서 감사합니다. DB 자료는 어디서 읽습니까? 컨트롤러 클래스? 이 패턴을 사용하여 거기에 플래시 카드 세트를 저장 하시겠습니까? – Awaken

+0

제어기는 필요한 경우 새 모델 클래스를 작성하는 스토리지 기능을 읽습니다. 귀하의 플래시 카드를 보관하는 곳은 귀하의 사업이지만, 그것은 디스크 나 데이터베이스에있을 것입니다. 기억 장치가 모델을 시뮬레이션하는 것과 같지 않기 때문에 아마도 다른 패턴이 가장 좋을 것입니다. 모델에 대한 코드는 실제로 쓰는 것에 달려 있습니다. 요구 사항이 얼마나 느슨한지를 고려하여 프로그램을 정확하게 제공 할 수는 없지만 패턴이 어떻게 발생하는지 보여 드리겠습니다. 그것의 한 부분에 적용될 수있다. –