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

时间:2014-10-29 20:27:16

标签: java observer-pattern

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

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

我的问题是:当我运行程序时,程序只向我显示经销商的牌...而不是玩家。或者有时它反过来 - 程序会显示玩家的卡片,但不会显示经销商的卡片......那么我应该怎样做才能制作我的节目"参见&#34 ;经销商的手和玩家的手?我会感谢任何帮助或提示如何解决这个问题......

我知道观察者模式是如何运作的,但由于某种原因,我不知道如何制作观察模式"观察"同一类的两个对象。我需要让它观察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);
          }
      }

Dealer Class扩展了Player类,它还有一些额外的击打,站立等方法。

在视图类中,我有这个更新方法:

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

再一次,感谢任何帮助......我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

Observer界面在javadoc中定义了update方法:

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;