2015-06-29 52 views
2

在策略設計模式中,提到了無狀態策略。任何人都可以通過回答以下問題來幫助我理解它:關於無狀態策略的困惑

  1. 什麼是無狀態策略?
  2. 它解決了什麼問題?
  3. 使用地方&不使用?
  4. 派息(一)同一

dvantages我會高度讚賞,如果這一切都可以通過給一個例子來說明。

+0

*在策略設計模式中,提到了無狀態策略*。請鏈接或引用。這就是說,無狀態策略是沒有任何狀態的Strategy接口的具體實現。 :) – CKing

+1

根據四本書的策略模式的後果:對象數量增加。策略增加了應用程序中對象的數量。有時候,你可以通過實施策略來減少這種開銷,這些策略可以作爲環境可以共享的無狀態對象。任何剩餘狀態由上下文維護,該上下文將每個請求傳遞給策略對象。共享策略不應該在調用之間保持狀態。 Flyweight(218)模式更詳細地描述了這種方法。 –

回答

2

什麼是無狀態策略?

無狀態策略是策略的一個「運行」不會影響另一個策略的策略。

這裏有採摘truefalse兩種策略:

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(); 
    } 
} 

上下文對象也是可以說是清潔的設計。最後一個選擇是世界的財產,而不是戰略,所以它不應該是它的一員。