首页 > 其他分享 >设计模式---策略模式+工厂

设计模式---策略模式+工厂

时间:2023-11-07 14:11:54浏览次数:30  
标签:SDIProtocolType protocol String req private 工厂 --- 设计模式 public

关键词:设计模式,策略模式,工厂模式

概要

现在我需要实现一个功能,是添加一路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);

    }
}

标签:SDIProtocolType,protocol,String,req,private,工厂,---,设计模式,public
From: https://www.cnblogs.com/keboom/p/17814864.html

相关文章

  • redis-shake安装部署(4.0.2)
    环境:Os:Centos7redis-shake:4.0.2说明:redis源端和目的端都是单节点1.项目地址https://github.com/tair-opensource/RedisShake/tags2.下载介质我这里下载的版本是4.0.2,文件如下:redis-shake-linux-amd64.tar.gz 3.安装[root@localhostsoft]#mkdir-p/opt/redis-shake......
  • 文心一言 VS 讯飞星火 VS chatgpt (130)-- 算法导论11.2 2题
    二、用go语言,对于一个用链接法解决冲突的散列表,说明将关键字5,28,19,15,20,33,12,17,10插入到该表中的过程。设该表中有9个槽位,并设其散列函数为h(k)=kmod9。文心一言:在这个问题中,我们使用Go语言来解决一个散列(Hash)表的问题,该问题需要我们使用链接法解决冲突。我们的散......
  • 通过 SAP UI5 IconTabBar 控件结合 FlexibleColumnLayout 实现多页面 Master-Detail
    本文也是来源于网络上一位朋友的咨询,这是这位朋友实际项目中的真实需求。本文介绍了一个实际项目中开发需求的详细实现过程。通过使用SAPUI5IconTabBar控件,我们可以让逻辑上属于不同业务范畴的界面,通过点击对应的Icon,以切换的方式,在同一块屏幕区域显示出来。IconTabBar结......
  • 无涯教程-批处理 - EXPAND函数
    此批处理命令从压缩的.cab机柜文件中提取文件。EXPAND-语法EXPAND[cabinetfilename]EXPAND-示例@echooffEXPANDexcel.cab上面的命令将在当前位置提取excel.cab文件的内容。参考链接https://www.learnfk.com/batch-script/batch-script-expand.html......
  • 2023-11-07 如何删除navicat 注册表
    注:我只删掉了Registration12XCS,其它没有删,我怕给pc整崩了。1.win+r打开运行窗口并输入regedit: 2.找到路径:计算机\HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\NavicatPremium\Registration12XCS 删除Registration12XCS,如果有Update也一并删除,3.再开路径:计算机\HKEY_CURREN......
  • iwtgm-16
    题目链接A.层取,因为它的高度只有2e5,我把每个高度的方格个数记录下来最后从高到低跑一遍,大于k的ans++有几个点:顺序无关紧要,所以先从小到大排个序从右往左,若前一个与当前的高度相同就continue,直到高度不相同有一个变量now,记录的是当前高度把当前高度-1的方格个数就是n-i+1......
  • NodeJS系列(15)- TypeScript (二) | 对象类型 (Object Types)
    在“NodeJS系列(14)-TypeScript(一)|安装TypeScript、常用类型”里,我们简单介绍了TypeScript的安装配置,讲解和演示了TypeScript常用类型。本文继续介绍TypeScript对象类型(ObjectTypes)。TypeScript:https://www.typescriptlang.org/(中文版:https://ts.nodejs.cn/)Micro......
  • NodeJS系列(14)- TypeScript (一) | 安装 TypeScript、TypeScript 常用类型
    JavaScript现在是有史以来最广泛使用的跨平台语言之一。JavaScript最初是一种用于向网页添加微不足道的交互性的小型脚本语言,现已发展成为各种规模的前端和后端应用的首选语言。虽然用JavaScript编写的程序的大小、作用域和复杂性呈指数级增长,但JavaScript语言表达不同代码......
  • 无涯教程-批处理 - DRIVERQUERY函数
    此批处理命令显示所有已安装的设备驱动程序及其属性。DRIVERQUERY-语法driverqueryDRIVERQUERY-示例@echooffdriverquery上面的命令将显示当前系统上安装的所有设备驱动程序的信息。以下是显示的信息子集的示例。WacomPenWacomSerialPenHIDDKernel......
  • H3C-Link-Aggregation.链路聚合
    简介以太网链路聚合通过将多条以太网物理链路捆绑在一起形成一条以太网逻辑链路实现增加链路带宽的目的,同时这些捆绑在一起的链路通过相互动态备份,可以有效地提高链路的可靠性。基本概念聚合组:链路捆绑是通过接口捆绑实现的,多个以太网接口捆绑在一起后形成一个聚合组成员端口:被捆绑......