繁体   English   中英

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

[英]Java: Observe many objects of same class

我正在做家庭作业,我希望有人能给我一两个提示,因为我被困住了。 我有一个使用Model-View-Controller结构的Java BlackJack游戏,我需要扩展该程序。 我必须在该程序中实现观察者模式。

我在模型中有一个玩家类别和一个经销商类别(经销商扩展玩家)。 我有一个视图类,其中包含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);
          }
      }

Dealer类扩展了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());

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

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM