这是一个如何拆分的简单示例。
据推测,玩家的牌表示为“手”或类似的对象(即牌的集合)。这是你的模型。所以让我们调用你的模型:
package casino.blackjack.model;
class DealtCards
{..}
您可能使用 JPanel 或其他一些 Swing 构造来显示您的卡片。因此,您可以将实际渲染每张卡片的所有对象放在一个单独的包中:
package casino.blackjack.view;
class DealtCardsView
{..}
DealtCards 对象的存在独立于它的显示方式,但如果用户在 GUI 上执行某些操作,它的状态可能会改变。例如,要求被“击中”。据推测,可能有一个按钮来执行此操作。视图源自您的模型。
package casino.blackjack.view;
class DealtCardsView
{
JButton hitMeButton = new JButton("HIT");
DealtCards cards;
public DealtCardsView(DealCards myCards)
{
cards = myCards;
renderCards();
}
private void renderCards(){.. do something..}
}
现在,如果玩家决定击球,他的 DealtCards 对象就会改变。因此,我们希望实现一种更新模型的方式。您可以使用控制器类来执行此操作。控制器类实现 ActionListener 接口。当执行一个动作时(即用户点击“点击”按钮),控制器更新模型。所以视图不能直接更新模型。它只是发送一个“动作”已经发生的通知。任何相关方,在这种情况下,即我们的控制者,都可以采取适当的行动。
package casino.blackjack.controller;
class DealtCardsController implements ActionListener
{
DealtCards cards;
DealtCardsView cardView;
public DealtCardsController(DealtCards myHand, DealtCardsView myView)
{
cards = myHand;
cardView = myView;
cardView.hitMeButton.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
cards.changed();
}
}
因此,您将应用程序分为三层。您的模型只包含当前状态(或当前数据)以及围绕它的任何验证。您的视图类以适当的方式呈现模型。视图上的任何用户交互都由控制器处理,然后控制器负责更新模型。
这样,如果您想更改视图(例如使用小程序而不是窗口),您的模型就不会在意。
抱歉,回复冗长,但希望对您有所帮助!
编辑:这里有一个很好的 MVC 解释:java / gwt UI coding - clean code