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

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就能实现对应的策略!

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掂掂三生有幸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值