发布于 2026-01-06 1 阅读
0

空对象模式

空对象模式

很多时候,函数会接受可以为空的对象引用,我们通常会添加 if 语句来处理传递给函数的 null 值这种特殊情况,并提供默认响应或不执行任何操作。在下面的示例中,`calculateSpeed` 函数需要一个包含 `getSpeed` 函数的对象。在 JavaScript 中,我们需要这样做:

class Car {
  getSpeed(){
    return 100;
  }
}


const calculateSpeed = function(vehicle){
  if(vehicle && typeof vehicle.getSpeed === 'function'){
    return vehicle.getSpeed();
  } else {
    return 50;
  }
}

const car1 = new Car();

console.log(calculateSpeed(car1)); // 100
console.log(calculateSpeed()); // 50
Enter fullscreen mode Exit fullscreen mode

但还有更好的方法来实现这一点。利用空对象模式,我们可以创建一个充当车辆的类,我们称之为DefaultMovable……

class DefaultMovable {
  getSpeed(){
    return 50;
  }
}
Enter fullscreen mode Exit fullscreen mode

我们的DefaultMovable类提供了默认功能(即我们前面代码片段中的 else),这样我们就可以避免使用 if/else 语句。

class Car {
  getSpeed(){
    return 100;
  }
}

class DefaultMovable {
  getSpeed(){
    return 50;
  }
}

const calculateSpeed = function(vehicle = new DefaultMovable()){
  return vehicle.getSpeed();
}

const car1 = new Car();

console.log(calculateSpeed(car1)); // 100
console.log(calculateSpeed()); // 50
Enter fullscreen mode Exit fullscreen mode

该模式的 UML 图如下所示:

同样的例子在 Ruby 中如下所示:

class Car
  def get_speed
    100
  end
end

class DefaultMovable
  def get_speed
    50
  end
end


def getSpeed(vehicle = DefaultMovable.new)
  vehicle.get_speed();
end
Enter fullscreen mode Exit fullscreen mode

这只是一个模式,任何模式都有其优缺点,请根据您的实际应用场景谨慎应用。(示例为虚构,仅用于演示该模式)

文章来源:https://dev.to/avraammavridis/null-object-pattern-5bod