这两种卡片设计模式中哪一个更稳定/首选?

时间:2014-09-21 08:53:38

标签: java oop

我正在学习OOP概念,这是我之前的问题的延续。只是为了练习,我正在设计一副纸牌。我有两种模式

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的新类。

作为一个新手,我无法弄清楚第二种设计是否存在任何缺点,或者我是否违反任何设计原则。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

52个课程(如果你想包括笑话,则为54个) extreme 。如果您想要另一个构造来表示特定的套装,可以使用一个,也许两个类轻松完成。

这样想。什么实际组成一张卡?

  • 诉讼
  • 面值
  • 其专有名称(即10个俱乐部)

如果我们想再分解一下,我们可以说西装只会是四种价值之一 - 黑桃,棍棒,心形和钻石 - 这很适合于枚举。

面值在纸牌游戏之间有所不同,并且取决于您想要代表Ace的方式,它可能是套装中价值最高的卡,也可能是套装中价值最低的卡。你想要一些你想要的面值的特殊行为。

我看到两个类开始 - 一个用于Card,它定义了我们关注的所有元数据的基本容器,以及Suit的枚举,用于定义我们支持的四个基本套装。

对于小丑支持,你可以认为笑话者要么是红色还是黑色(你可以选择合适的红色/黑色套装),或者不要定义套装。对于你实际玩的是什么类型的纸牌游戏,这又有所不同,但重要的是要考虑。