这两副牌的设计图案中哪一张更稳定/更受欢迎



我正在学习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的新类。

作为一个新手,我不知道第二个设计是否有任何缺点,或者我是否违反了任何设计原则。

有人能帮我做这个吗?

52个类(如果您想包括jokers,则为54个)是极限。如果你想用另一个构造来表示特定的套装,那么用一个,也许两个类就可以很容易地实现这一点。

这样想吧。卡片实际上是由什么组成的?

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

如果我们想进一步分解,我们可以说一套西装只会是四种价值观之一——黑桃、球杆、红心和钻石——这很适合枚举。

不同纸牌游戏的面值不同,根据你想如何代表Ace,它可能是套装价值最高的牌,也可能是套装价格最低的牌。对于你想要的面值,你会想要一些特殊的行为。

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

为了支持小丑,你可以考虑小丑是红色或黑色(你可以选择合适的红色/黑色西装),也可以不定义西装。这也因你实际玩的是哪种纸牌游戏而有所不同,但考虑一下很重要。

最新更新