策略工厂模型
策略模式大概有三个角色:接口类、实现类、策略工厂类。
下面我们将在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);