A代码与此类似:
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。但我有两个问题:
我可以通过创建一个带有决策逻辑的提供方法来克服(1)(不确定它是否是最好的方法)。
但我不知道如何处理(2)。 在这种情况下手动创建注入对象是否可以?有没有人看到另一种解决方案?
答案 0 :(得分:1)
正如您所说,向提供者方法添加逻辑不是一个好的设计决策。在某些情况下,手动实例化对象是有效的,但仅作为最后的手段。
在这种情况下,最好的方法(IMHO)是注入抽象工厂,按需实例化IStrategy
实现。
在当前状态下,工厂方法需要接受额外的参数,允许您指定您感兴趣的策略。虽然它不是世界末日,但客户端控制哪个它使用的策略有点不干净 - 客户知道有多少策略。
根据具体的用例,您可能能够重构代码并提取区分客户端策略的逻辑。这样,您的客户端将要求IStrategy
,同时完全不知道实现的具体细节和可用实现的数量。