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

Posted

技术标签:

【中文标题】Java:观察同一类的许多对象【英文标题】:Java: Observe many objects of same class 【发布时间】:2014-10-29 20:27:15 【问题描述】:

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

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

我的问题是:当我运行程序时,程序只显示庄家的牌......而不是玩家。或者有时是相反的——程序显示玩家的牌,但不显示庄家的牌……那么我应该怎么做才能让我的程序“看到”庄家的手和玩家的手?对于如何解决此问题的任何帮助或提示,我将不胜感激...

我知道观察者模式是如何工作的,但由于某种原因,我不知道如何让它“观察”同一类的两个对象。我需要让它观察 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的类在哪里?好的,我看到它是“视图”类。您需要一个具有两个参数的update 方法,一个Observable 和一个Object,以匹配this 方法。 【参考方案1】:

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&lt;Card&gt;,参数仍然必须是Object,因为类型必须与接口中的类型匹配。然后你必须强制转换它才能像 List 一样使用它:

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

【讨论】:

以上是关于Java:观察同一类的许多对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用cpp中的QThread使用一个对象运行同一类的两个线程?

观察者模式——学习笔记

如何有效地比较同一类的两个对象并检查哪些是不同的字段?

JAVA基础6-面向对象1

Java二十三设计模式之------观察者模式

同步随笔