5

在设计以下应用设计模式的类时,最好的方法是什么?

  • Deck - addCard、deal、shuffle、getTopCard、removeTopCard、removeAllCards
  • - addCard、removeCard、getCard、removeAllCards
  • DiscardPile - addCard、getTopCard、removeTopCard、removeAllCards
  • MeldPile - addCard,removeAllCards

(MeldPile 包含表中的所有融合。)

对我来说,我认为getTopCardandremoveTopCard只是 and 的包装getCardremoveCard因为它只是获取卡片的顶部位置然后将其传递给getCardor removeCard

我应该使用组合吗?战略模式?或者只是创建另一个名为CardPile的类并将其用作上述类的基类?如果您能提供一个示例代码,我将不胜感激。

4

1 回答 1

6

我认为您可以使用像下面这样的单个甲板类来实现您想要的,它本质上是围绕Stack的包装器,我不明白为什么任何特定的甲板/桩/手不想要大多数(如果不是全部)相同的方法。

class Deck {
    private Stack<Card> cards = new Stack<Card>();

    public Deck() { }

    public Deck(int numberOfCards) {
        for (int i=0; i<numberOfCards; i++) {
            cards.push(CardFactory.createCard(i));
        }
    }

    private void shuffle() {
        Collections.shuffle(this.cards);
    }

    public void sort() {
        Collections.sort(this.cards);
    }

    public void removeAllCards() {
        this.cards.removeAllElements();
    }

    public void removeCard(Card c) {
        int i = this.cards.search(c);
        this.cards.remove(i);            
    }

    public Card getCard(Card c) {
        int i = this.cards.search(c);
        return this.cards.get(i);
    }

    public Card getTopCard() {
        return this.cards.pop();
    }

    public Card getNthCard(int i) {
        return this.cards.get(i);
    }

    public Card addCard(Card c) {
        this.cards.push(c);
    }

}

我看到的唯一真正的问题是deal()方法以及这是否应该是甲板的责任?我个人不这么认为,这让我认为也许你会有一个 Player 类和一个 Dealer 类,它扩展了 Player 并实现了处理套牌的逻辑

class Player() {
    protected String name;
    protected Deck hand = new Deck();

    public void addCard(Card c) {
        this.hand.addCard(c);
    }

    // .....
}

class Dealer() extends Player {
    private Deck deck;

    public Dealer(int deckSize) {
        this.deck = new Deck(deckSize);
    }

    public void deal(Player[] players, int numberOfCards) {
        for (player in players) {
            for (int i=0; i<numberOfCards; i++) {
                player.addCard(this.deck.getTopCard());
            } 
        }
    }

    // .....
}
于 2012-02-06T13:53:52.250 回答