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

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

正文


设想场景例如 登录策略


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.编写实现类


9.png

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


相关文章
|
2月前
|
设计模式 算法
设计模式之 Strategy(策略模式)
设计模式之 Strategy(策略模式)
30 1
|
2月前
|
设计模式 算法 PHP
php设计模式--策略模式(六)
php设计模式--策略模式(六)
21 0
|
2月前
|
设计模式 算法 搜索推荐
设计模式之策略模式
设计模式之策略模式
58 0
|
8天前
|
设计模式 算法 搜索推荐
Java设计模式之策略模式详解
Java设计模式之策略模式详解
|
9天前
|
设计模式 算法
策略模式-大话设计模式
策略模式-大话设计模式
7 0
|
2月前
|
设计模式 算法 Java
Java一分钟之-设计模式:策略模式与模板方法
【5月更文挑战第17天】本文介绍了策略模式和模板方法模式,两种行为设计模式用于处理算法变化和代码复用。策略模式封装不同算法,允许客户独立于具体策略进行选择,但需注意选择复杂度和过度设计。模板方法模式定义算法骨架,延迟部分步骤给子类实现,但过度抽象或滥用继承可能导致问题。代码示例展示了两种模式的应用。根据场景选择合适模式,以保持代码清晰和可维护。
35 1
|
2月前
|
设计模式 算法 Java
小谈设计模式(3)—策略模式
小谈设计模式(3)—策略模式
|
3天前
|
设计模式 JavaScript 算法
js设计模式【详解】—— 策略模式
js设计模式【详解】—— 策略模式
7 0
|
7天前
|
设计模式 算法
设计模式之美—策略模式
设计模式之美—策略模式
|
15天前
|
设计模式 算法
行为设计模式之策略模式
行为设计模式之策略模式