枚举方式实现设计模式-策略模式

1.编写枚举类

2.编写登录策略接口类

3.编写实现类

4.编写登录环境角色类

5.调用策略


设想场景例如 登录策略

1.编写枚举类

public enum LoginEnum {

	OTHER_PHONE_LOGIN("OTHER", "otherLoginService", "其他手机号登录"),
	NATIVE_PHONE_LOGIN("NATIVE", "nativeLoginService", "本机登录"),
	QQ_LOGIN("QQ", "qqLoginService", "QQ登录"),
	WE_CHAT_LOGIN("WECHAT", "weChatLoginService", "微信登录"),;

	LoginEnum(String loginType, String serviceName, String desc) {
		this.loginType = loginType;
		this.serviceName = serviceName;
		this.desc = desc;
	}

	public static LoginEnum getValue(String loginType) {
		for (LoginEnum loginEnum : LoginEnum.values()) {
			if (loginEnum.getLoginType().equals(loginType)) {
				return loginEnum;
			}
		}
		return LoginEnum.NATIVE_PHONE_LOGIN;
	}

	private String loginType;

	private String serviceName;

	private String desc;

	public String getLoginType() {
		return loginType;
	}

	public String getServiceName() {
		return serviceName;
	}

	public String getDesc() {
		return desc;
	}
}

2.编写登录策略接口类

/**
 * @Author liuy
 * @Description 登录策略接口类
 * @Date 2021/11/10 14:54
 * @Version 1.0
 */
public interface LoginInterface {

     String login(LoginVO loginVO) ;
}

3.编写实现类

注意实现类的@Service必须与LoginEmun的serviceName的值一致,这样spring才能根据serviceName找到这个策略

例如:OtherLoginService


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/**
 * @Author liuy
 * @Description 其他手机号登录服务
 * @Date 2021/11/10 15:23
 * @Version 1.0
 */
@Service("otherLoginService")
public class OtherLoginService implements LoginInterface{

    @Override
    public String login(String loginType) {
        return "我是其他手机号登录"
    }
}

4.编写登录环境角色类

import com.soboot.auth.enums.LoginEnum;
import com.soboot.auth.service.LoginInterface;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author liuy
 * @Description 登录环境角色类
 * @Date 2021/11/10 15:31
 * @Version 1.0
 */
@Service
public class LoginSpringContext {


    @Autowired
    private final Map<String, LoginInterface> strategyMap = new ConcurrentHashMap<>(4);

    /**
     * 根据登录类型获取不同策略
     * @param loginType
     * @return
     */
    public LoginInterface getService(String loginType) {
        LoginEnum loginEnum = LoginEnum.getValue(loginType);
        return strategyMap.get(loginEnum.getServiceName());
    }
}

这个类的作用是把所有策略 加载到内存

5.调用策略

    @Autowired
    private LoginSpringContext loginSpringContext;
    
    /**
     * 登录通用服务
     *
     * @param loginVO 登录参数
     * @return 登录信息
     */
    public String loginIn(String loginType) {
        LoginInterface service = loginSpringContext.getService(loginType);
        String loginTypeName= service.login(loginVO);

        return loginTypeName;
    }

 当调用这个方法时只需要填入对应的loginType就能实现对应的策略!

写完了 祝大家生活愉快 欢迎评论讨论!

猜你喜欢

转载自blog.csdn.net/weixin_42469135/article/details/122603908