我正在学习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的新类。
作为一个新手,我无法弄清楚第二种设计是否存在任何缺点,或者我是否违反任何设计原则。
有人可以帮帮我吗?
答案 0 :(得分:1)
52个课程(如果你想包括笑话,则为54个) extreme 。如果您想要另一个构造来表示特定的套装,可以使用一个,也许两个类轻松完成。
这样想。什么实际组成一张卡?
如果我们想再分解一下,我们可以说西装只会是四种价值之一 - 黑桃,棍棒,心形和钻石 - 这很适合于枚举。
面值在纸牌游戏之间有所不同,并且取决于您想要代表Ace的方式,它可能是套装中价值最高的卡,也可能是套装中价值最低的卡。你想要一些你想要的面值的特殊行为。
我看到两个类开始 - 一个用于Card
,它定义了我们关注的所有元数据的基本容器,以及Suit
的枚举,用于定义我们支持的四个基本套装。
对于小丑支持,你可以认为笑话者要么是红色还是黑色(你可以选择合适的红色/黑色套装),或者不要定义套装。对于你实际玩的是什么类型的纸牌游戏,这又有所不同,但重要的是要考虑。