猿问

实现不违反封装的 OOP 委托

这是一个关于赌博的简单场景。
有一个赌徒和骰子。赌徒可以掷骰子。然后骰子的值会改变

对于上述场景,我创建了这个类图

如上图

赌徒可以掷骰子, 在赌徒掷骰子时在Gambler.roll()方法中实现

,骰子值在变化,在Dice.roll()方法中实现


使用如下所示的java代码实现上述场景请注意此代码为伪代码,语法可能有误


class Gambler{

  private Dice dice;


  Gambler(Dice dice){

    this.dice = dice;

  }


  public void roll(){

    dice.roll();//delegation call

  }

}


/* --------------------------- */


import java.util.Random;

class Dice{

  private int faceValue;


  public int getFaceValue(){

    return faceValue;

  }



  public void roll(){

    //get random value between 1 ,6

    Random random = new Random();

    this.faceValue =  random.nextInt((6 - 1) + 1) + 1;

  }

}

我想知道

我的实现是否符合 OOAD 最佳实践并且不违反封装?


特别是在将掷骰子委托Gambler给Dice班级时是否正确Gambler有roll()方法?


慕标琳琳
浏览 144回答 2
2回答

holdtom

你的设计基本上是正确的。唯一的就是-前面缺少的faceValue属性。我不确定缺少的指标是否默认为某些内容(乍一看无法找到和指示)。无论如何,您应该添加它以使其明确。此外,Dice应重命名为Die(singular)。最后(更深入地研究您的代码)您需要一个Die包含 2 个元素的数组,而不仅仅是一个元素,dice并且您需要同时掷两个骰子。

料青山看我应如是

我认为骰子不是赌徒的一部分,赌徒只有掷骰子的行为。我认为下面的实现会更好:class Gambler{    //some field    public int roll(Dice dice){        return dice.roll();    }}/* --------------------------- */import java.util.Random;class Dice{     private int[] values = new int[]{1,2,3,4,5,6};     public int roll(){         //get random value between 1 ,6         Random random = new Random();         return values[random.nextInt((6 - 1) + 1) + 1];     }}当然,这取决于实际需求。
随时随地看视频慕课网APP

相关分类

Java
我要回答