Java:观察同一类的许多对象



我正在做一项家庭作业,我希望有人能给我一两个提示,因为我被卡住了。我有一个Java中的BlackJack游戏,它使用模型-视图-控制器结构,我需要扩展这个程序。我必须在这个程序中实现观察者模式。

我在模型中有一个玩家类和一个经销商类(经销商扩展了玩家)。我有一个视图类,它包含UI所需的所有代码。Player类正在实现Observerable接口,View类正在实现Observer接口。我还有一个控制器,叫做PlayGame。因此View类就是观察者。

我的问题是:当我运行程序时,程序只显示经销商的卡。。。而不是玩家。或者有时相反——程序显示玩家的牌,但不显示发牌人的牌。。。那么,我应该怎么做才能让我的程序"看到"经销商和玩家的手呢?我将感谢任何关于如何解决这个问题的帮助或提示。。。

我知道观察者模式是如何工作的,但由于某种原因,我不知道如何使它"观察"同一类的两个对象。我需要让它观察玩家类的两个不同对象(我将发牌人和玩家计算为同一类型,因为发牌人正在扩展玩家类)。

这是代码:

玩家等级:

    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;

}

在控制器中,我有这个:

        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());

再次感谢您的帮助。。。我只是不知道如何解决这个问题。

Observer接口有一个update方法,在javadoc:中定义如下

void update(Observable o,
            Object arg)

notifyObservers中,您已经编写了

o.update(m_hand, this);

但是this是一个Player,它实现了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;

最新更新