Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这两种卡片设计模式中,哪一种更稳定/更可取?_Java_Oop - Fatal编程技术网

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);
    }
}