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

标签 java observer-pattern

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

我在模型中有一个玩家类和一个庄家类(庄家扩展了玩家)。我有一个 View 类,其中包含 UI 所需的所有代码。 Player类实现了Observerable接口(interface),View类实现了Observer接口(interface)。我还有一个名为 PlayGame 的 Controller 。所以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 类,它有一些额外的方法,用于击球、站立等。

在 View 类中我有这个更新方法:

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

public void update(List<Card> m_hand) {

        playerHand = m_hand;


}

在 Controller 中,我有这个:

        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接口(interface)有一个update方法在 javadoc 中定义如下:

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 ,因为类型必须与接口(interface)中的类型匹配。然后,您必须对其进行强制转换才能像 List 一样使用它。 :

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

关于Java:观察同一类的许多对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26640028/

相关文章:

java - 通过 maven-wadl-plugin 生成 wadl 时出错

java - 基础编程类(class)...第一次使用字符串。

Java - Swing - MVC/观察者模式 - 如何构造这两个类以遵守 MVC 模式?

Dart 可观察更改处理程序

c++ - 当按引用传递的参数存储在被调用者对象中,然后被调用者删除时会发生什么?

javascript - Firefox 插件拦截和修改 POST 数据并获取 URL

java - 每次将 Json 响应解析为不同的 Java 对象

java - 更新 JLabel 以显示贪吃蛇游戏的当前得分

java - 如何单击警报中的按钮?

c++ - arb 的静态 ctor/dtor 观察器。 C++类