2014-09-21 29 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