spring如何使用策略模式

1、在spring中怎样实现Context 上下文角色

/**
 * 策略工厂,从spring上下文中提取策略
 * @author :Cai.ChangJun
 * @version 1.0.0
 * @Date : 2021/6/1
 */
@Component
public class LoginStrategyFactory implements InitializingBean, ApplicationContextAware {
    
    
    private final Map<LoginType, LoginService> strategyMap = new ConcurrentHashMap<>();
    private ApplicationContext appContext;

    @Override
    public void afterPropertiesSet() throws Exception {
    
    
        // 将 Spring 容器中所有的 LoginHandler 注册到 strategyMap
        appContext.getBeansOfType(LoginService.class)
                .values().forEach(hander->strategyMap.put(hander.getLoginType(),hander));
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    
    
        appContext = applicationContext;
    }

    public LoginService getStrategy(LoginType loginType) {
    
    
        return strategyMap.get(loginType);
    }
}


2、 定义策略角色(Strategy)

public interface LoginService {
    
    
    /**
     * 获取登录类型
     * @description:
     * @author Cai.ChangJun
     * @return: 登录类型
     * @version 1.0.0
     * @Date 2021/6/1 17:35
     */
    LoginType getLoginType();


    /**
     * 登录并获得token一小时过期 缓存登录对象半小时过期
     * @author Cai.ChangJun
     * @param username : 用户名
     * @param password : 密码
     * @return UserDTO : 登录对象抽象
     * @version 1.0.0
     * @Date 2021/5/26 23:48
     */
    UserDTO login(String username, String password);
}


3、具体策略实现

@Component
@Slf4j
public class PhoneChatLoginStrategy implements LoginService {
    
    
    @Override
    public LoginType getLoginType() {
    
    
        return LoginType.PHONE;
    }

    @Override
    public UserDTO login(String username, String password) {
    
    
        //TODO 未实现手机登录
        log.info("手机登录成功");
        return new UserDTO();
    }
}
@Component
@Slf4j
public class WeChatLoginStrategy  implements LoginService {
    
    
    @Override
    public LoginType getLoginType() {
    
    
        return LoginType.WE_CHAT;
    }

    @Override
    public UserDTO login(String username, String password) {
    
    
        //TODO 未实现微信登录
        log.info("微信登录成功");
        return new UserDTO();
    }
}


4、使用

public enum LoginType {
    
    
    QQ,
    WE_CHAT,
    PHONE;
}
我们这里写了两个登录策略,具体调用:
@RestController
@RequestMapping("/user")
@Slf4j
public class PublicUserController {
    
    
	@Autowired
    private LoginStrategyFactory loginStrategyFactory;
    
     @PostMapping("/login")
    public Response<UserDTO> login(@RequestBody @Validated LoginParam loginParam) {
    
    
        log.info("用户登录:{}",loginParam.getUsername());
        LoginService strategy = 			                    loginStrategyFactory.getStrategy(loginParam.getLoginType());
        UserDTO login = strategy.login(loginParam.getUsername(), loginParam.getPassword());
        return new Response<>(login);
    }
}


猜你喜欢

转载自blog.csdn.net/weixin_49390750/article/details/132827459