Table of Contents
替换项目中的if-else方法(工厂模式+策略模式)
一、项目中出现的if-else的情形
@Override
public void onClick(View view) {
int i = view.getId();
if (i == R.id.tv_forget_gestrue_pwd) {
showForgetGesturePasswordTips();
} else if (i == R.id.tv_other_account_login) {
showSwitchAccountsTips();
}
}
从设计的角度看,通常不建议采用if-else,况且有时在一些场合下我们会采用大量的if-else且还有多重的嵌套的if-else,这样的代码维护起来比较困难,所以我们可以根据实际的业务场景进行一定的优化替换,目的是既从业务逻辑上能够更有条理,又利于代码的阅读和维护。
下面仅提供一种思路,仅供参考。
二、引入策略模式优化分支
策略接口
public interface Strategy {
public void doOperate(Context pContext);
}
不同的分支去实现该策略接口
public class GesturePwdStrategy implements Strategy {
@Override
public void doOperate(Context pContext) {
showForgetGesturePasswordTips(pContext);
}
public void showForgetGesturePasswordTips(Context pContext){
Log.v("testStrategy","showForgetGesturePasswordTips");
}
}
public class OtherAccountLoginStrategy implements Strategy {
@Override
public void doOperate(Context pContext) {
showSwitchAccountsTips(pContext);
}
public void showSwitchAccountsTips(Context pContext){
Log.v("testStrategy","showSwitchAccountsTips");
}
}
三、用工厂模式去生成不同策略(生成不同分支)
工厂采用的是单例模式,同时将不同的策略产生出来。
public class StrategyFactory {
public static final int KEY_GESTURE_PWD = R.id.tv_forget_gestrue_pwd;
public static final int KEY_OTHER_ACCOUNT_LOGIN = R.id.tv_other_account_login;
private static StrategyFactory factory = new StrategyFactory();
private StrategyFactory(){
}
private static Map<Integer,Strategy> strategyMap = new HashMap<Integer,Strategy>();
static{
strategyMap.put(KEY_GESTURE_PWD, new GesturePwdStrategy());
strategyMap.put(KEY_OTHER_ACCOUNT_LOGIN, new OtherAccountLoginStrategy());
}
public Strategy creator(int pType){
return strategyMap.get(pType);
}
public static StrategyFactory getInstance(){
return factory;
}
}
四、Client调用
@Override
public void onClick(View view)
{
Strategy strategy = StrategyFactory.getInstance().creator(view.getId());
strategy.doOperate(MainActivity.this);
}
五、注意事项
1、Strategy 中对Activity进行了强引用(此例较为简单,仅作为参数传入并不会造成内存泄漏的风险),可优化为对Activity弱引用的方式,以避免在较为复杂的业务中内存泄漏风险;
2、如果出现大量的if-else的情形则可考虑在工厂模式中采用懒加载的方式,避免内存中出现大量可能用不到的对象;
3、if-else的业务本就比较简单,应注意避免设计过度。
六、Demo的项目结构