php – 这是策略模式的一个很好的用例吗?
我正在使用需要接收多个视频的应用程序,并将其显示在特定页面上,目前这些视频只能来自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匹配与视频提供者一起封装的意愿,在添加新策略时保持工厂稳定的愿望,以及添加新策略的速度解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |