定义一个登录service接口
public interface LoginService {
Integer strategyKey();
Auth login(LoginDTO loginDTO);
}
多种登录方式实现类
@Service
@Slf4j
public class EmailLoginServiceImpl implements LoginService {
@Override
public Integer strategyKey() {
return LoginTypeEnum.EMAIL.getCode();
}
@Override
public Auth login(LoginDTO loginDTO) {
// 登录操作
}
}
@Service
@Slf4j
public class PhoneLoginServiceImpl implements LoginService {
@Override
public Integer strategyKey() {
return LoginTypeEnum.PHONE.getCode();
}
@Override
public Auth login(LoginDTO loginDTO) {
// 登录操作
}
}
策略类
@Component
@Slf4j
public class LoginStrategy {
private final Map<Integer, LoginService> serviceMap = new ConcurrentHashMap<>(16);
@Resource
private List<LoginService> loginServices;
@PostConstruct
public void init() {
for (LoginService service : loginServices) {
log.info("登录策略模式的键值对: key={},value={}", service.strategyKey(), service);
serviceMap.put(service.strategyKey(), service);
}
}
public LoginService getStrategy(int key) {
return serviceMap.get(key);
}
}
Controller中登录
// 根据类型获取不同的service
LoginService loginService= loginStrategy.getStrategy(loginDTO.getLoginType());
// 登录
loginService.login(loginDTO)