空对象模式
很多时候,函数会接受可以为空的对象引用,我们通常会添加 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
但还有更好的方法来实现这一点。利用空对象模式,我们可以创建一个充当车辆的类,我们称之为DefaultMovable……
class DefaultMovable {
getSpeed(){
return 50;
}
}
我们的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
该模式的 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
这只是一个模式,任何模式都有其优缺点,请根据您的实际应用场景谨慎应用。(示例为虚构,仅用于演示该模式)
文章来源:https://dev.to/avraammavridis/null-object-pattern-5bod
