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

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。设计模式—策略模式+工厂,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

概要

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

    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195891.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!