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

策略工厂模型

在这里插入图片描述
策略模式大概有三个角色:接口类、实现类、策略工厂类。

下面我们将在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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会飞的小蜗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值