import lombok.extern.slf4j.Slf4j;
import java.util.Optional;
import java.util.stream.Stream;
@Slf4j
public class EnumUtils {
private static final String MESSAGE = "INVALID ENUM CODE , %s , %s";
/**
* 根据枚举code获取枚举对象
*
* @param enumClass 枚举对象
* @param code code值
* @param <T>
* @return
*/
public synchronized static <T extends NTEnum> T getEnumByCode(Integer code, Class<T> enumClass) {
Optional<T> enumOptional = Stream.of(enumClass.getEnumConstants()).filter(item -> item.code().equals(code)).findAny();
if (!enumOptional.isPresent()) {
log.info(String.format(MESSAGE, enumClass.getName(), code));
throw new RuntimeException(String.format(MESSAGE, enumClass.getName(), code));
}
return enumOptional.get();
}
}
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum LoginTypeEnum implements NTEnum {
/**
* 抖音小程序登录
*/
DOUYIN_MINI_PROGRAM_LOGIN(1, "抖音小程序登录"),
/**
* 支付宝小程序
*/
ALIPAY_MINI_PROGRAM_LOGIN(2, "支付宝小程序登录"),
/**
* 美团登录
*/
MEITUAN_PROGRAM_LOGIN(3, "美团登录");
private int code;
private String desc;
@Override
public Integer code() {
return code;
}
@Override
public String desc() {
return desc;
}
}
public interface NTEnum {
/**
* 枚举代码
*
* @return
*/
Integer code();
/**
* 枚举描述
*
* @return
*/
String desc();
}
import com.design.strategy1.util.LoginTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @Title
* @Description
* @Author wangzs
* @Version 1.0.0
* @CraeteTime 2023/2/18 17:14
**/
@Slf4j
@Component
public class AlipayLoginStrategy extends LoginStrategy {
@Override
public boolean match(LoginTypeEnum loginTypeEnum) {
return loginTypeEnum == LoginTypeEnum.ALIPAY_MINI_PROGRAM_LOGIN;
}
@Override
public String login(String name) {
String mes = "AlipayLoginStrategy:" + name;
System.out.println(mes);
return mes;
}
}
import com.design.strategy1.util.LoginTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @Title
* @Description
* @Author wangzs
* @Version 1.0.0
* @CraeteTime 2023/2/18 17:14
**/
@Slf4j
@Component
public class DouyinLoginStrategy extends LoginStrategy{
@Override
public boolean match(LoginTypeEnum loginTypeEnum) {
return loginTypeEnum == LoginTypeEnum.DOUYIN_MINI_PROGRAM_LOGIN;
}
@Override
public String login(String name) {
String mes = "DouyinLoginStrategy:" + name;
System.out.println(mes);
return mes;
}
}
/**
* 会员登录注册
*/
@Slf4j
@Component
public class LoginBiz {
@Autowired
private LoginFactory loginFactory;
public String login(Integer loginType, String username) {
return loginFactory.create(loginType).login(username);
}
}
import com.design.strategy1.util.EnumUtils;
import com.design.strategy1.util.LoginTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 选择登录策略
*/
@Component
public class LoginFactory {
/**
* 所有登录策略集合,spring自动注入
*/
@Autowired
List<LoginStrategy> loginStrategyList;
/**
* 选择登录策略
*
* @param loginType 登录类型
* @return 登录策略
*/
public LoginStrategy create(Integer loginType) {
return loginStrategyList.stream().filter(item -> item.match(EnumUtils.getEnumByCode(loginType, LoginTypeEnum.class))).findFirst().get();
}
}
/**
* @Title
* @Description
* @Author wangzs
* @Version 1.0.0
* @CraeteTime 2023/2/18 17:07
**/
@Slf4j
public abstract class LoginStrategy {
public abstract boolean match(LoginTypeEnum loginTypeEnum);
public abstract String login(String name);
}
/**
* @Title
* @Description
* @Author wangzs
* @Version 1.0.0
* @CraeteTime 2023/2/18 17:14
**/
@Slf4j
@Component
public class MeituanLoginStrategy extends LoginStrategy {
@Override
public boolean match(LoginTypeEnum loginTypeEnum) {
return loginTypeEnum == LoginTypeEnum.MEITUAN_PROGRAM_LOGIN;
}
@Override
public String login(String name) {
String mes = "MeituanLoginStrategy:" + name;
System.out.println(mes);
return mes;
}
}
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @Title
* @Description
* @Author wangzs
* @Version 1.0.0
* @CraeteTime 2023/2/18 17:22
**/
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class LoginBizTest {
@Autowired
LoginBiz loginBiz;
@Test
public void test_1() {
loginBiz.login(1, "支付宝");
loginBiz.login(2, "抖音");
loginBiz.login(3, "美团");
loginBiz.login(4, "其他登录");
}
}