在实际项目中使用-策略模式

1,534 阅读2分钟

疫情期间,我们身先士卒,为打赢这次防疫战贡献自己的力量,搭建起一个信息化平台,支撑政府、企业、园区、员工开展防疫工作。其中基础功能:登陆,因为人群(政府、企业、员工)的不同导致登陆方式的不同。

初期,我们的代码可能是这样写的:

/**
 * 登陆接口
 * @param type g:政府;e:企业;p:员工
 */
@PostMapping("/login/{type}")
public String login(@PathVariable String type) {
    if ("g".equals(type)) {
        # 政府登陆逻辑
    } else if ("e".equals(type)) {
        # 企业登陆逻辑
    } else if ("p".equals(type)) {
        # 员工登陆逻辑
    }
    return token;
}

后面需求变化了,又加了一种登陆方式,那么我们的if/else就会特别的长。此时,策略模式就粉墨登场了,使用策略模式改造后的代码会是这样的:

@PostMapping("/login/{type}")
public String login(@PathVariable String type) {
    retrun LoginStrategyFactory.getLoginStrategy(type).login();
}

改造后是不是很清爽啊,那就让我们使用策略模式一步一步来改造我们的代码吧!

1. 首先得有一个登陆策略接口
/**
 * 登陆策略接口
 */
public interface LoginStrategy {
    String login();
}
2. 然后要有实际的登陆策略

这里就列举一个政府登陆策略,而企业登陆策略,员工登陆策略,空策略(也是默认策略,匹配不到真正的策略就返回一个空策略)这里就不一一列举了。

/**
 * 政府登陆策略实现类
 */
public class GovernmentLoginStrategy implements LoginStrategy {
    @Override
    public String login() {
        System.out.println("政府登陆,访问数据库校验用户名密码");
    }
}
3. 创建一个登陆策略工厂
/**
 * 登陆策略工厂
 */
public final class LoginStrategyFactory {

    /**
     * 实际保存登陆策略的map
     */
    private static Map<String, LoginStrategy> loginStrategyMap = new HashMap<>();

    static {
        loginStrategyMap.put("g", new GovernmentLoginStrategy());
        loginStrategyMap.put("e", new EnterpriseLoginStrategy());
        loginStrategyMap.put("p", new PersonalLoginStrategy());
    }

    /**
     * 私有构造函数
     */
    private LoginStrategyFactory() { }

    /**
     * 获取登陆策略
     * @param key 登陆策略的key
     * @return 登陆策略,loginStrategyMap里面没有则返回空策略
     */
    public static LoginStrategy getLoginStrategy(String key) {
        LoginStrategy loginStrategy = loginStrategyMap.get(key);
        return loginStrategy == null ? new EmptyLoginStrategy() : loginStrategy;
    }
}

下一篇我们将使用模版方法模式来改造登陆逻辑

好了,到这里我们的策略模式就改造完了。

如果后面再增加一种登陆方式,我们只需要写一个登陆策略,然后把该登陆策略放到登陆策略工厂里面就好了!