2017-03-02 82 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

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