我正在做家务,我希望有人可以给我一两个提示,因为我被困了。我有一个使用模型 - 视图 - 控制器结构的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());
再一次,感谢任何帮助......我不知道如何解决这个问题。
答案 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;