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

  • 甲板-addCard,deal,shuffle,getTopCard,removeTopCard,removeAllCards
  • -addCard,removeCard,getCard,removeAllCards
  • DiscardPile -addCard,getTopCard,removeTopCard,removeAllCards
  • MeldPile -addCard,removeAllCards

  • (MeldPile将表中的所有熔炉保存起来。)

    对我而言,我认为getTopCardremoveTopCard只是getCardremoveCard的包装,因为它只是获得卡的顶部位置,然后将其传递给getCardremoveCard

    我应该使用合成吗?策略模式?还是只创建另一个名为 CardPile 的类,并将其用作上述类的基类?非常感谢您可以提供示例代码。

    最佳答案

    我认为您可以通过下面的单个甲板类实现您想要的东西,该类本质上是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()方法,这是否应该由Deck负责?我个人并不这样认为,这使我认为也许您将拥有一个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());
                }
            }
        }
    
        // .....
    }
    

    10-08 11:12