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)模式更詳細地描述了這種方法。 –