2
在策略设计模式中,提到了无状态策略。任何人都可以通过回答以下问题来帮助我理解它:关于无状态策略的困惑
- 什么是无状态策略?
- 它解决了什么问题?
- 使用地方&不使用?
- 派息(一)同一
dvantages我会高度赞赏,如果这一切都可以通过给一个例子来说明。
在策略设计模式中,提到了无状态策略。任何人都可以通过回答以下问题来帮助我理解它:关于无状态策略的困惑
dvantages我会高度赞赏,如果这一切都可以通过给一个例子来说明。
什么是无状态策略?
无状态策略是策略的一个“运行”不会影响另一个策略的策略。
这里有采摘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();
}
}
上下文对象也是可以说是清洁的设计。最后一个选择是世界的财产,而不是战略,所以它不应该是它的一员。
*在策略设计模式中,提到了无状态策略*。请链接或引用。这就是说,无状态策略是没有任何状态的Strategy接口的具体实现。 :) – CKing
根据四本书的策略模式的后果:对象数量增加。策略增加了应用程序中对象的数量。有时候,你可以通过实施策略来减少这种开销,这些策略可以作为环境可以共享的无状态对象。任何剩余状态由上下文维护,该上下文将每个请求传递给策略对象。共享策略不应该在调用之间保持状态。 Flyweight(218)模式更详细地描述了这种方法。 –