有一个与此类似的代码:

class MyActivity extends Activity {
    IStrategy mStrategy;

    public void onCreate(Bundle data) {
        if (someSpecificCondition) {
            mStrategy = new StrategyA();
        } else {
            mStrategy = new StrategyB();
        }
    }

    public void onUnsupportedState() {
        // Will have to switch strategy
        mStrategy = new StrategyB();
    }
}


我想在这里注入IStrategy。但是我有两个问题:


它是一个接口,具体实现会动态更改。
即使选择了具体的实现方式,也有可能需要重新创建它。


我可以通过创建具有决策逻辑的provider方法来克服(1)(虽然不确定这是否是最佳方法)。

但是我不确定该怎么做(2)。
在这种情况下可以手动创建注入的对象吗?有人看到其他解决方案了吗?

最佳答案

如您所说,向提供者方法添加逻辑并不是一个好的设计决定。在某些情况下,手动实例化对象是有效的,但这只是万不得已。

在这种情况下,最好的方法(IMHO)是注入抽象工厂,该工厂根据需要实例化IStrategy实现。

在当前情况下,factory方法将需要接受其他参数,使您可以指定感兴趣的策略。虽然这不是世界末日,但实际上由客户控制它使用的策略有点不干净-客户知道有多少种策略。

根据手头的特定用例,您可能能够重构代码并提取出区分客户端策略的逻辑。这样,您的客户将要求IStrategy,同时完全不了解实现的细节和可用实现的数量。

10-08 17:10