替换项目中的if-else方法(工厂模式+策略模式)

Table of Contents

替换项目中的if-else方法(工厂模式+策略模式)

一、项目中出现的if-else的情形

二、引入策略模式优化分支

三、用工厂模式去生成不同策略(生成不同分支)

四、Client调用

 

五、注意事项

六、Demo的项目结构


替换项目中的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的项目结构

猜你喜欢

转载自blog.csdn.net/u010375903/article/details/81192507