加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 这是策略模式的一个很好的用例吗?

发布时间:2020-12-13 17:18:56 所属栏目:PHP教程 来源:网络整理
导读:我正在使用需要接收多个视频的应用程序,并将其显示在特定页面上,目前这些视频只能来自YouTube,因为实施不允许其他提供商,因为获取视频数据的代码作为预览图像,直接放置在负责显示视频的View Helper中. 我想改变这个结构,以便轻松添加新的提供者,比如Vimeo,我
我正在使用需要接收多个视频的应用程序,并将其显示在特定页面上,目前这些视频只能来自YouTube,因为实施不允许其他提供商,因为获取视频数据的代码作为预览图像,直接放置在负责显示视频的View Helper中.

我想改变这个结构,以便轻松添加新的提供者,比如Vimeo,我认为策略模式将是理想的,我会在我的View Helper中使用方法setVideoUrl(string $url),这个方法会调用来自VideoProviderFactory类的方法getProviderStrategy(string $url),该工厂类将返回(如果可用的话)为视频网址提供者实现接口VideoProvider的策略类.

你怎么看?这是对的?我需要改变什么?

细节:我最初考虑过将一个开关直接选择到View Helper中,但在看完这个问题之后:我Strategy Pattern with no ‘switch’ statements?我看到我错了,然后出现了类VideoProviderFactory.

解决方法

这似乎是一个非常好的设计,适当分离责任.

为了给您提供更多的思考,请考虑工厂将如何决定创建哪种策略.以后当你想要添加另一个策略时,需要改变什么?首先,您将创建一个新的VideoProvider,然后您必须更改工厂switch语句(如您所述)并包含此新策略的选择逻辑.现在,这在大多数情况下都非常好,但是如果你想在不改变工厂的情况下添加新策略呢?

一种方法是使用类似工厂的界面,该方法根据URL决定是否应该创建特定的VideoProvider;我们称之为VideoProviderMatcher(伪代码):

interface VideoProviderMatcher {
  bool understands(url)
  VideoProvider create()
}

现在,此接口知道它是否理解URL以及如何创建与其相关的VideoProvider.当您需要创建新策略时,您实现了VideoProvider和相关的VideoProviderMatcher.至于工厂,它更改为使用责任链(伪代码)封装VideoProviderMatchers列表并委托给理解给定URL的第一个:

class VideoProviderFactory {
  List[VideoProviderMatcher] matchers
  void registerMatcher(VideoProviderMatcher matcher) {
    matchers.add(matcher)
  }
  VideoProvider getVideoProviderFor(url) {
    foreach (matcher in matchers) {
      if (matcher.understands(url)) return matcher.create()
    }
  }
}

现在唯一需要更改的代码是首先创建工厂的代码.理想情况下,它有一个VideoProviderMatchers列表,用于填充工厂,您只需将另一个项目添加到列表中.

现在,这值得吗?我要说这取决于匹配逻辑的复杂性,将URL匹配与视频提供者一起封装的意愿,在添加新策略时保持工厂稳定的愿望,以及添加新策略的速度解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读