工厂+策略模式

开闭原则:对扩展开放,对修改关闭

改造后,不在service中写业务逻辑,让service调用工厂,然后通过service传递不同的参数获取不同的登录策略

具体实现:

抽象策略类:UserGranter

/**
* 抽象策略类
*/
public interface UserGranter{
    /**
    * 获取数据
    * @param loginReq 传入的参数
    * @return map值
    */
    LoginResp login(LoginReq loginReq);
}

具体的策略:AccountGranter、SmsGranter、WeChatGranter

/**
* 策略:账号登录
**/
@Component
public class AccountGranter implements UserGranter{
	@Override
	public LoginResp login(LoginReq loginReq) {
        System.out.println("登录方式为账号登录" + loginReq);
        // TODO
        // 执行业务操作
        return new LoginResp();
	}
}
/**
* 策略:短信登录
*/
@Component
public class SmsGranter implements UserGranter{
    @Override
    public LoginResp login(LoginReq loginReq) {
    	System.out.println("登录方式为短信登录" + loginReq);
        // TODO
   	 	// 执行业务操作
   	 	return new LoginResp();
    }
}
/**
* 策略:微信登录
*/
@Component
public class WeChatGranter implements UserGranter{
    @Override
    public LoginResp login(LoginReq loginReq) {
        System.out.println("登录方式为微信登录" + loginReq);
        // TODO
        // 执行业务操作
        return new LoginResp();
    }
}

工程类:UserLoginFactory

/**
* 操作策略的上下文环境类 工具类
* 将策略整合起来 方便管理
*/
@Component
public class UserLoginFactory implements ApplicationContextAware {
	private static Map<String, UserGranter> granterPool = new ConcurrentHashMap<>();
	@Autowired
	private LoginTypeConfig loginTypeConfig;
    /**
    * 从配置文件中读取策略信息存储到map中
    * {
    * account:accountGranter,
    * sms:smsGranter,
    * we_chat:weChatGranter
    * }
    *
    * @param applicationContext
    * @throws BeansException
    */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
	loginTypeConfig.getTypes().forEach((k, y) -> {
	granterPool.put(k, (UserGranter) applicationContext.getBean(y));
	});
}
    /**
    * 对外提供获取具体策略
    *
    * @param grantType 用户的登录方式,需要跟配置文件中匹配
    * @return 具体策略
    */
    public UserGranter getGranter(String grantType) {
   	 	UserGranter tokenGranter = granterPool.get(grantType);
    	return tokenGranter;
    }
}

在application.yml文件中新增自定义配置

login:
	types:
		account: accountGranter
		sms: smsGranter
		we_chat: weChatGranter

新增读取数据配置类

Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "login")
public class LoginTypeConfig {
	private Map<String,String> types;
}

改造service代码

@Service
public class UserService {
	@Autowired
	private UserLoginFactory factory;
	public LoginResp login(LoginReq loginReq){
		UserGranter granter = factory.getGranter(loginReq.getType());
		if(granter == null){
			LoginResp loginResp = new LoginResp();
			loginResp.setSuccess(false);
			return loginResp;
		}
		LoginResp loginResp = granter.login(loginReq);
		return loginResp;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值