2017-03-02 51 views
0
在遊戲類的

名單
SomeStrategyInterface - 接口策略模式
FooStrategy - 實施SomeStrategyInterface
BarStrategy - 實施SomeStrategyInterface
BazStrategy - 實施SomeStrategyInterface
StrategyProvider的 - 工廠類,以提供具體實施SomeStrategyInterface MessageDispatcher的 - 類信息調度工作線程的消息類型的0 ABTask - 一型工人類的,其處理細節的消息類型,並需要StrategyProvider靜態註冊表類春季

流是
MessageDispatcher - >new ABTask() - >StrategyProvider.get()

public class ABTask implements Runnable{ 

    public ABTask(StrategyProvider provider){ 
     this.provider = provider 
    } 

    public void run(){ 
    //need to use StrategyProvider here 
    } 
} 


public class MessageDispatcher{ 
    private final StrategyProvider provider; 
     public void handleMsg(){ 
     //I don't want to pass provider from here 
     new ABTask(provider) 
    } 
} 

立即訪問StrategyProvider我將不得不因爲我使用Spring Dependency InjectionMessageDispatcherABTask通過它的實例。雖然通過這樣做,我正在爲MessageDispatcher課增加噪音。所以我想知道有沒有什麼辦法靜態訪問此提供程序,甚至露出提供商方法爲靜態,這樣我可以從ABTask按如下方式使用它:

public void run(){ 
    StrategyProvider.get(args) 
} 

請不要建議改變MessageDispatcher類。其他想法是受歡迎的。

+0

嗯「雖然通過這樣做,我將噪聲加入'MessageDispatcher'類」如果'MessageDispatcher'取決於'Strategy'那麼我們就必須在這個類被注入,所以我不會在這裏看到任何噪音的依賴 – niceman

+0

@niceman'MessageDispacther'不取決於'Strategy',其'ABTask'需要它。 – Sikorski

+0

hmm true,你不能將'Strategy'傳遞給'ABTask'構造函數嗎?或者你希望'ABTask'在運行時改變其'Strategy'? – niceman

回答

0

假設StrategyProvider爲彈簧管理以下方法bean應當通過自動裝配工作

@Component 
public class StrategyFactory { 

    private static StrategyProvider strategyProvider; 

    @Autowired 
    private StrategyProvider provider; 

    @PostConstruct 
    public void init() { 
     StrategyFactory.strategyProvider = provider; 
    } 

    public static StrategyProvider getStrategyProvider() { 
     return strategyProvider; 
    } 
} 

在另一個豆得到的StrategyProvider實例並將其提供給一些靜態方法。這不是靜態的方法可以在ABTask可以使用如下

public void run() { 
    StrategyFactory.getStrategyProvider().get(args) 
} 

但是要注意的疑難雜症在這裏,如果春季完成應用程序上下文初始化一個討厭的NullPointerException會遇到之前靜態方法StrategyFactory.getStrategyProvider()被調用。

+0

我有點希望避免走這條路。春天裏沒有任何註冊管理機構的概念可以做出來嗎? – Sikorski

+0

不幸的是沒有(*至少我不知道*) –