spring 中封装 策略工厂设计模式

spring 中封装 策略工厂设计模式,第1张

文章目录
      • 策略工厂模型
      • 下面我们将在spring 中实现 策略模式:
        • 1、接口类
        • 2、接口实现类
          • 2-1、实现类 1
          • 2-2、实现类 2
          • 2-3、枚举类
          • 2-4、实体DTO
        • 3、策略工厂
        • 4、调用

策略工厂模型


策略模式大概有三个角色:接口类、实现类、策略工厂类。

下面我们将在spring 中实现 策略模式: 1、接口类
import cn.dbsec.web.common.response.ResponseInfo;

/**
 * @Description: 策略接口
 * @author: DBSEC-TJ
 * @date: 2022/4/19 10:18
 */
public interface SocketStrategy {
    public ResponseInfo socketDo(WebsocketDto o);
    String getSocketType();
}

2、接口实现类 2-1、实现类 1
package cn.dbsec.system.dao.socketStrtegy;

import cn.dbsec.dbaa.enums.system.WebsocketDtoType;
import cn.dbsec.dbaa.pojo.system.WebProvingEntity;
import cn.dbsec.dbaa.pojo.system.WebsocketDto;
import cn.dbsec.dbaa.strategicfactory.system.SocketStrategy;
import cn.dbsec.system.dao.WbProvingDao;
import cn.dbsec.web.common.response.ResponseInfo;
import cn.dbsec.web.common.spring.util.MessageSourceUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Description: 策略实现 1
 * @author: lei.yu
 * @date: 2022/4/19 10:47
 */
@Component
public class HeartBeatOpenStrategy implements SocketStrategy {
    @Autowired
    private WbProvingDao wbProvingDao;
    @Override
    public ResponseInfo socketDo(WebsocketDto w) {
       //自己的业务实现~~~~~~~
    }

    @Override
    public String getSocketType(){
        return WebsocketDtoType.HEARTBEAT_OPEN.getType();
    }
}

2-2、实现类 2
import cn.dbsec.system.dao.WbProvingDao;
import cn.dbsec.web.common.response.ResponseInfo;
import cn.dbsec.web.common.spring.util.MessageSourceUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

/**
 * @Description: 策略实现 2
 * @author: lei.yu
 * @date: 2022/4/19 10:47
 */
@Component
public class HeartBeatCloseStrategy implements SocketStrategy {
    @Autowired
    private WbProvingDao wbProvingDao;
    @Override
    public ResponseInfo socketDo(WebsocketDto w) {
        //自己的业务实现~~~~~~~
    }
    @Override
    public String getSocketType(){
        return WebsocketDtoType.HEARTBEAT_CLOSE.getType();
    }
}

2-3、枚举类
/**
 * @Description: websocket请求类型参数枚举
 * @author: DBSEC-lei.yu
 * @date: 2022/4/19 8:49
 */
@Getter
@AllArgsConstructor
public enum WebsocketDtoType implements Serializable {

    HEARTBEAT_OPEN("open"),//心跳打开
    HEARTBEAT_CLOSE("close"),//心跳关闭
    GET_INDEX_DATA("getIndexData");//获取首页定时数据

    private String type;
}
2-4、实体DTO
import lombok.Data;
import java.io.Serializable;

/**
 * @Description: websocket入参封装
 * @author: lei.yu
 * @date: 2022/4/19 8:39
 */
@Data
public class WebsocketDto implements Serializable {

    private String uid;
    private String uname;
    private String clientIp;

    //拓展时用什么参数自己加吧...
}
3、策略工厂
import cn.dbsec.web.common.response.ResponseInfo;
import org.springframework.stereotype.Service;
import org.apache.log4j.Logger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 策略工厂
 */
@Service
public class SocketStrategyFactory {
	
  private Map<String, SocketStrategy> eventServiceMap = new ConcurrentHashMap<>();
  private static final Logger logger = Logger.getLogger(SocketStrategyFactory.class.getName());
  /**
   * 构造函数
   * @param eventServices spring容器中按需加载实现类
   */
  public SocketStrategyFactory(List<SocketStrategy> eventServices) {
    for (SocketStrategy eventService : eventServices) {
      eventServiceMap.put(eventService.getSocketType(), eventService);
    }
  }

  /**
   * 根据事件类型调用不同的实现类处理
   */
  public ResponseInfo getStrategy(String eventType, WebsocketDto websocketDto) {
    SocketStrategy eventService = eventServiceMap.get(eventType);
    if (eventService == null){
      //类加载异常
      logger.info(String.format("socket 类工厂加载异常,请按照枚举类中的信息来调取:"+eventType));
    }
    return eventService.socketDo(websocketDto);
  }
}

4、调用
//直接通过策略工厂调用
socketStrategyFactory.getStrategy(WebsocketDtoType.HEARTBEAT_OPEN.getType(),websocketDto);

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/874575.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存