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

举报
ShyLock 发表于 2022/05/27 14:02:34 2022/05/27
【摘要】 ​1.编写枚举类2.编写登录策略接口类3.编写实现类4.编写登录环境角色类5.调用策略设想场景例如 登录策略1.编写枚举类public enum LoginEnum { OTHER_PHONE_LOGIN("OTHER", "otherLoginService", "其他手机号登录"), NATIVE_PHONE_LOGIN("NATIVE", "nativeLoginService", "...


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


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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。