我一直在读这个“demeter法”的东西,它(和纯粹的“包装”类一般)似乎通常是反模式。考虑一个实现类:包装/ demeter定律似乎是反模式
class FluidSimulator {
void reset() { /* ... */ }
}
现在考虑另一个类的两种不同的实现:
class ScreenSpaceEffects1 {
private FluidSimulator _fluidDynamics;
public FluidSimulator getFluidSimulator() { return _fluidDynamics; }
}
class ScreenSpaceEffects2 {
private FluidSimulator _fluidDynamics;
public void resetFluidSimulation() { _fluidDynamics.reset(); }
}
,并调用方式表示方法:
callingMethod() {
effects1.getFluidSimulator().reset(); // Version 1
effects2.resetFluidSimulation(); // Version 2
}
乍一看,第2版似乎更简单一些,并遵循“Demeter规则”,隐藏Foo的实现等等,但是这将FluidSimulator中的所有更改都联系到了ScreenSpaceEffects。例如,如果一个参数添加的复位,然后我们有:
class FluidSimulator {
void reset(bool recreateRenderTargets) { /* ... */ }
}
class ScreenSpaceEffects1 {
private FluidSimulator _fluidDynamics;
public FluidSimulator getFluidSimulator() { return _fluidDynamics; }
}
class ScreenSpaceEffects2 {
private FluidSimulator _fluidDynamics;
public void resetFluidSimulation(bool recreateRenderTargets) { _fluidDynamics.reset(recreateRenderTargets); }
}
callingMethod() {
effects1.getFluidSimulator().reset(false); // Version 1
effects2.resetFluidSimulation(false); // Version 2
}
在这两个版本,callingMethod需要改变,但在第2版,ScreenSpaceEffects 也需要改变。有人可以解释具有包装器/外观的优点(除适配器外或包装外部API或暴露内部API)。
编辑:其中一个我碰到这个,而不是一个微不足道的例子的实例。
你的意思是“版本2似乎更简单”? – 2010-03-31 06:54:07
是的,很抱歉,会改变 – 2010-03-31 06:57:14
版本1不遵循德米特的规则。输错? – Corwin 2010-03-31 06:58:24