2014-10-29 17 views
1

我正在做一個家庭作業,我希望有人能給我一兩個提示,因爲我被卡住了。我有一個使用模型 - 視圖 - 控制器結構的Java遊戲,我需要擴展這個程序。我必須在這個程序中實現觀察者模式。Java:觀察同一類別的很多對象

我在模特里有一個玩家等級和一個經銷商等級(莊家擴展玩家)。我有一個視圖類,其中包含UI所需的所有代碼。 Player類正在實現Observerable接口,而View類正在實現Observer接口。我也有一個名爲PlayGame的控制器。所以View類是觀察者。

我的問題是:當我運行程序時,程序只顯示了經銷商的卡片......而不是玩家。或者有時候是相反的 - 程序顯示玩家的牌,但不顯示經銷商的牌......所以我應該怎麼做才能使我的程序「看到」莊家的手和玩家的手?我會感謝任何幫助或提示如何解決這...

我知道如何觀察者模式的作品,但由於某種原因,我不知道如何讓它「觀察」同一類的兩個對象。我需要讓它觀察Player類中的兩個不同對象(我將經銷商和玩家統計爲同一類型,因爲經銷商正在擴展玩家類)。

下面的代碼:

Player類:

public class Player implements Observable{ 

     private List<Card> m_hand; 
     private ArrayList<Observer> handOfCards; 

     public Player() 
     { 

     m_hand = new LinkedList<Card>(); 
     handOfCards = new ArrayList<Observer>(); 
     } 

     public void DealCard(Card a_addToHand) 
     { 
     m_hand.add(a_addToHand); 
     notifyObservers(); 
     } 

     public void addObserver(Observer o) { 
      handOfCards.add(o); 
     } 

     public void notifyObservers() { 
      for(Observer o : handOfCards){ 
       o.update(m_hand, this); 
      } 
     } 

的經銷商類擴展播放器類,它有擊中,站立等

在一些額外的方法視圖類我有這種更新方法:

private List<Card> playerHand = new LinkedList<Card>(); 

public void update(List<Card> m_hand) { 

     playerHand = m_hand; 


} 

在控制器中,我有th是:

 a_view.DisplayWelcomeMessage(); 

     a_game.getPlayer().addObserver(a_view); 
     a_game.getDealer().addObserver(a_view); 
     a_view.DisplayDealerHand(a_game.GetDealerHand(), a_game.GetDealerScore()); 

     //This method below should show player's cards, but it shows dealer's card 
     a_view.DisplayPlayerHand(a_game.GetPlayerHand(), a_game.GetPlayerScore()); 

再次,感謝您的任何幫助......我只是不知道如何解決這個問題。

+0

哪裏是實現'Observer'類?好的,我看到它是「視圖」類。你需要一個'update'方法,它有兩個參數,一個'Observable'和一個'Object',以匹配[this](http://docs.oracle.com/javase/8/docs/api/java/util/ Observer.html#update-java.util.Observable-java.lang.Object-)方法。 – ajb 2014-10-29 20:36:59

回答

2

Observer接口已在javadoc這樣定義的update方法:

void update(Observable o, 
      Object arg) 

notifyObservers,你寫

o.update(m_hand, this); 

thisPlayer,它實現Observable,所以你首先想要的:

o.update(this, m_hand); 

第二個參數m_hand,我假設你想傳遞給觀察者的參數。然而,在實現Observer課堂上,update方法必須具有相同的參數類型,在Javadoc定義的:

public void update(Observable o, Object hand) { 

即使你知道hand永遠是List<Card>,參數仍然是一個Object,因爲類型必須與界面中的類型相匹配。然後,您必須將它轉換爲能夠使用它像一個List

public void update(Observable o, Object handArg) { 
    List<Card> hand = (List<Card>)handArg;