2014-09-21 19 views
0

我正在學習面向對象的概念,這是我前一個問題的延續。只是爲了練習,我正在設計一副牌。我在心中這兩款卡片設計圖案中哪款更穩定/首選?

public interface ISuit { 
    String getLogo(); 
    String getName(); 
} 

public class Card { 
    ISuit suit; 
    Integer n; 

    public Card(ISuit suit, Integer n) { 
     this.suit = suit; 
     this.n = n; 
    } 

    void setSuit(ISuit suit){ 
     this.suit = suit; 
    } 

    void display(){ 
     System.out.println(suit.getName()+","+n); 
    } 
} 

其次模式

public interface Icard<T extends ISuit> { 
    T getSuit(); 
    String getNumber(); 
} 



public class Queen<E extends ISuit> implements Icard<E> { 
    Class<E> clazz; 


    public Queen(Class<E> clazz) { 
     this.clazz = clazz; 
    } 

    @Override 
    public String getNumber() { 
     return "12"; 
    } 

    @Override 
    public E getSuit() { 
     try { 
      return clazz.newInstance(); 
     } catch (InstantiationException | IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 

顯然,第一個是更加直觀和直接的兩種模式。在那邊,我會用正確的西裝,數字作爲參數的52個卡的對象。
在第二個設計中,我將爲每張卡片索引創建13個類,然後用正確的套裝實例化它們。將來,如果有新的索引,我可以創建一個擴展Icard的新類。

作爲一個新手,我無法弄清楚是否有任何第二個設計的缺點,或者我違反了任何設計原則。

請問有人可以幫助我嗎?

+0

隨着第二個設計,你將不得不創建13個幾乎相同的類,這是浪費,它比它需要更復雜。你的getSuit方法是浪費的,每次調用都會創建一個新的對象。考慮使用一個枚舉類的西裝。使字段私有和最終,所以卡實例是不可變的。 – 2014-09-21 09:02:33

+0

用於學習/練習面向對象的概念,考慮另一個領域,比如建模車輛(汽車,自行車,卡車)的庫存,這些車輛具有非常不同的實現方式和屬性,但共享很多行爲。 – ataulm 2014-09-21 09:06:21

回答

1

52類(54如果你想包括笑話)是極端。如果你想要有另一種結構來表示特定的套裝,這很容易用一個,也許兩個類來完成。

想想這樣吧。什麼組成一張卡?

  • 訴訟
  • 面值
  • 它的正式名稱(即俱樂部10)

如果我們想分解的是多一點,我們可以說,西裝是唯一它將成爲黑桃,俱樂部,心靈和鑽石這四種價值觀的其中一種 - 它很適合列舉。

紙牌遊戲之間的面值會有所不同,取決於您想要如何表示Ace,它可能是套牌中價值最高的牌,也可能是套牌中價值最低的牌。你想要一些特殊的行爲來表達你想要的面值。

我看到兩個類別開頭 - 一個爲Card,它定義了我們關心的所有元數據的基本容器,以及一個定義我們支持的四種基本套裝的枚舉()。

對於小丑的支持,你可以考慮讓小丑成爲紅色或黑色(並且你可以選擇合適的紅色/黑色西裝來跟隨),或者將衣服留在未定義的位置。這對於你實際玩什麼類型的紙牌遊戲又有所不同,但重要的是要考慮。

+0

您可以添加爲什麼Suit界面在這個特殊的例子中不適合嗎? – ataulm 2014-09-21 09:03:20

+1

我掩飾了界面,因爲它實現的界面只有一種類型的對象纔會使用。我可以在答案中加上這一點,但我覺得省略它表明它的重要性/相關性/重要性。 – Makoto 2014-09-21 09:04:18

+0

@Makoto我的推理背後使它成爲一個界面,將來我希望能夠添加新的西裝,如果需要的話。我想這可以通過枚舉來完成。 – Dude 2014-09-21 09:08:16