设计模式 · 第 9 题,共 12 题
一个结账服务通过 switch 选择支付方式,每新增一种支付方式都需要修改这个类。哪种重构符合开闭原则?
有 1 个正确答案。 中等
显示答案
答案
- A 一个带有 #[AutoconfigureTag('myext.payment')] 的接口 PaymentProviderInterface,每种支付方式一个类,并在服务中使用 #[AutowireIterator('myext.payment')] iterable $providers
解析
策略模式把每种支付方式封装在各自的类中,并使用共同的接口。容器通过标签收集所有实现,服务逐一询问它们是否负责。新的支付方式(也包括来自其他扩展的)可以在不修改服务的情况下添加。提取出来的 switch 或一个汇总类仍然需要为每种新方式进行修改。