我正在学习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
的枚举。
为了支持小丑,你可以考虑小丑是红色或黑色(你可以选择合适的红色/黑色西装),也可以不定义西装。这也因你实际玩的是哪种纸牌游戏而有所不同,但考虑一下很重要。