[英]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.