设计模式---策略模式+工厂
关键词:设计模式,策略模式,工厂模式
概要#
现在我需要实现一个功能,是添加一路SDI输出,但是输出的协议有不同,有udp、srt等,针对不同的协议我要做不同的操作,后面还有可能添加其他的协议,因此这里面用策略模式不错。
由于单纯的策略模式并不能完全消除if...else...,这里我们用了工厂模式再进行封装(其实就是通过List或Map,消除if...else...)
这里使用springboot管理bean,如果不是spring,自己去new就行。
代码概要#
策略接口#
public interface SDIStrategy {
/**
* 创建SDI,先在数据库中创建此目的地,然后在根据相关协议组装请求,去SMH创建目的地
*/
void createSDI(Route route, OpenSDIReq req);
}
策略实现#
@Component
public class SDIUDPStrategy implements SDIStrategy {
@Override
public void createSDI(Route route, OpenSDIReq req) {
// do something udp一般是内网访问,ip可配
}
}
@Component
public class SDISRTStrategy implements SDIStrategy {
@Override
public void createSDI(Route route, OpenSDIReq req) {
// do something srt给外网用,可配置端口,延时,加密方式,TTL等
}
}
工厂#
@Component
public class SDIStrategyFactory {
private static final Map<String, SDIStrategy> strategies = new HashMap<>();
@Resource
private SDIUDPStrategy sdiudpStrategy;
@Resource
private SDISRTStrategy sdisrtStrategy;
@PostConstruct
public void init() {
strategies.put(SDIProtocolType.UDP.getProtocol(), sdiudpStrategy);
strategies.put(SDIProtocolType.SRT.getProtocol(), sdisrtStrategy);
}
public SDIStrategy getStrategy(String protocol) {
if (SDIProtocolType.getEnum(protocol) == null) {
throw new ServiceException("illegal protocol type, please check it");
}
return strategies.get(protocol);
}
}
此enum类并不是重点,可不看
public enum SDIProtocolType {
UDP("udp"),
SRT("srt");
private String protocol;
SDIProtocolType(String protocol) {
this.protocol = protocol;
}
public String getProtocol() {
return protocol;
}
public static SDIProtocolType getEnum(String protocol) {
for (SDIProtocolType value : SDIProtocolType.values()) {
if (value.getProtocol().equals(protocol)) {
return value;
}
}
return null;
}
}
最终的调用#
@Slf4j
@Service
public class SDIServiceImpl implements ISDIService {
@Resource
private SDIStrategyFactory sdiStrategyFactory;
private void createSDIDest(Route route, OpenSDIReq req) {
String protocol = req.getProtocol();
SDIStrategy strategy = sdiStrategyFactory.getStrategy(protocol);
strategy.createSDI(route, req);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库