实现不违反封装的OOP委托

时间:2018-10-14 08:42:33

标签: java oop uml encapsulation ooad

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

对于上述情况,我创建了这个类图

enter image description here

如上图所示
赌徒可以掷骰子,它是在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()方法正确吗?

2 个答案:

答案 0 :(得分:2)

您的设计基本上是正确的。唯一的问题是const util = require("util"); // Imports the Google Cloud client library const monitoring = require("@google-cloud/monitoring"); // Your Google Cloud Platform project ID const projectId = "<YOUR PROJECT ID>"; // Creates a client const client = new monitoring.MetricServiceClient({ keyFilename: "<YOUR CREDENTIALS>" }); // list of metrics also avaliable at https://cloud.google.com/monitoring/api/metrics_gcp#gcp-cloudfunctions // list all metrics avaliable client .listMetricDescriptors({ // name: `projects/${projectId}/monitoredResourceDescriptors/cloud_function`, name: `projects/${projectId}`, filter: 'metric.type = starts_with("cloudfunctions.googleapis.com")' }) .then(results => { console.log(results); }) .catch(err => { console.error("ERROR:", err); }); const currentTime = new Date(); endTime = currentTime.toISOString(); startTime = new Date(currentTime - 1 * 60 * 60 * 1000).toISOString(); interval = { startTime: { // Limit results to the last 20 minutes seconds: Date.now() / 1000 - 60 * 60 }, endTime: { seconds: Date.now() / 1000 } }; // get the executions accross time client .listTimeSeries({ name: `projects/${projectId}`, filter: 'metric.type = "cloudfunctions.googleapis.com/function/execution_count" AND resource.label.function_name = "<YOUR FUNCTION NAME>"', view: "FULL", interval }) .then(results => { // console.log(results); console.log(util.inspect(results, { showHidden: true, depth: 5 })); }) .catch(err => { console.error("ERROR:", err); }); 属性前面缺少了-。我不确定缺少的指标是否默认为某种东西(乍一看找不到和指示)。无论如何,您应该添加它以使其明确。

此外,faceValue应该重命名为Dice(单数)。

最后(更深入地研究代码),您需要一个包含2个元素而不是一个Die的{​​{1}}数组,并且需要掷两个骰子。

答案 1 :(得分:0)

我认为骰子不是赌徒的一部分,赌徒只有掷骰子的行为。我认为下面的实现会更好:

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

当然,这取决于实际需求。