在战略设计模式中,提到了无国籍战略。有谁可以通过回答以下问题来帮助我理解它:
如果可以通过举例说明所有这些,我将非常感激。
答案 0 :(得分:4)
这种无国籍战略是什么?
无国籍战略是战略的“运行”不会影响另一个战略的战略。
以下是挑选true
或false
的两种策略:
public final class FlipStrategy {
private boolean lastPick;
public boolean pick() {
lastPick = !lastPick;
return lastPick;
}
}
和......
public final class RandomStrategy {
public boolean pick() {
return (new Random()).nextBoolean();
}
}
FlipStrategy
是一项有状态策略。您获得的结果取决于以前的结果。
RandomStrategy
是一种无国籍策略。您获得的结果是彼此独立的。
它解决了什么问题以及如何解决?
无国籍战略......
何处使用&不使用这个?
并非总是可以使用无状态策略。想象一下保镖的策略 - 它必须记住已经有多少人已经决定是否应该允许更多。
否则,无国籍战略会更好。
有时,您可以使用“上下文”对象将有状态策略转换为无状态策略。上下文对象将与策略相关的所有状态编码为参数。
在前面的示例中,上下文可能是:
public final class Context {
private final boolean lastPick;
public boolean getLastPick() {
return lastPick;
}
public Context(final boolean lastPick) {
this.lastPick = lastPick;
}
// hashCode etc...
}
现在FlipStrategy
可以无状态的方式实现:
public final class FlipStrategy {
public boolean pick(final Context context) {
return !context.getLastPick();
}
}
上下文对象也是一种可以说是更清晰的设计。最后一个选择是世界的属性,而不是策略,所以它不应该是它的成员。