Java 这两种卡片设计模式中,哪一种更稳定/更可取?
我正在学习面向对象的概念,这是我上一个问题的继续。为了练习,我正在设计一副牌。我有两种想法Java 这两种卡片设计模式中,哪一种更稳定/更可取?,java,oop,Java,Oop,我正在学习面向对象的概念,这是我上一个问题的继续。为了练习,我正在设计一副牌。我有两种想法 公共接口电路{ 字符串getLogo(); 字符串getName(); } 第二种模式 公共接口Icard{ T getSuit(); 字符串getNumber(); } 公营部门推行Icard{ 课堂讨论; 公共皇后(班级教室){ this.clazz=clazz; } @凌驾 公共字符串getNumber(){ 返回“12”; } @凌驾 公共电子诉讼{ 试一试{ 返回clazz.newInst
公共接口电路{
字符串getLogo();
字符串getName();
}
第二种模式
公共接口Icard{
T getSuit();
字符串getNumber();
}
公营部门推行Icard{
课堂讨论;
公共皇后(班级教室){
this.clazz=clazz;
}
@凌驾
公共字符串getNumber(){
返回“12”;
}
@凌驾
公共电子诉讼{
试一试{
返回clazz.newInstance();
}捕获(实例化异常|非法访问异常e){
e、 printStackTrace();
}
返回null;
}
}
显然,第一个更直观、更直截了当。在那里,我将52个对象的卡与正确的西装,数字作为参数在第二个设计中,我将为每个卡片索引创建13个类,然后用正确的套装实例化它们。将来,如果有一个新的索引,我可以创建一个扩展Icard的新类 作为一个新手,我不知道第二个设计是否有任何缺点,或者我是否违反了任何设计原则 有人能帮我一下吗?52门课(54门,如果你想包括小丑)是极端的。如果您想使用另一个构造来表示特定的套装,那么使用一个(可能是两个)类就可以很容易地实现这一点 这样想吧。卡片实际上是由什么组成的
- 西装
- 面值
- 其专有名称(即10个俱乐部)
Card
,另一个用于定义我们所支持的四个基本套件的Suit
对于小丑的支持,你可以认为小丑要么是红色的要么是黑色的(你可以选择一个合适的红色/黑色套装),或者留下不确定的套装。对于你玩的是什么样的纸牌游戏,这又是不同的,但要考虑的是。第二种设计,你必须创建13个几乎相同的类,这是浪费的,它比它需要的要复杂得多。您的
getSuit
方法很浪费,每次调用都会创建一个新对象。考虑使用EnUM类来进行诉讼。使字段是私有的和最终的,因此卡实例是不可变的。为了学习/实践OOP的概念,考虑另一个领域,如建模车辆(汽车、自行车、卡车)的库存,它们具有非常不同的实现和属性,但是分享了很多行为。你能补充一下为什么Suit接口在这个特定的例子中不合适吗?我忽略了接口,因为实现一个只由一种类型的对象使用的接口是没有意义的。我可以将其添加到答案中,但我觉得省略它表明了它的重要性/相关性/重要性。@Makoto我将其作为接口的理由是,将来如果需要,我希望能够添加新的诉讼。我想这可以通过enum来完成。@老兄,不过已经没有西装了。使用卡片可能是一个错误的领域来实践这一点,达到你想要的程度(例如,为泛型找到一个用例)。
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);
}
}