服务定位器模式的开闭原则

在我理解的软件设计原则列表中,开放式封闭原则是最简单的一种。 “打开扩展,关闭修改”-这个想法似乎很简单。 让我们创建一个有关验证的示例。

我们提供的服务提供了将消息发送给收件人的功能。 消息的类型可以是SMS,电子邮件和电报等。这是这些消息类型的结构。

显然,每种消息类型都有其自己的验证逻辑。 例如,SMSMessage必须具有有效的收件人电话号码,EmailMessage必须具有有效的收件人电子邮件地址。 我们需要一个类来处理验证,它看起来可能像这样。

@Autowired
    @Qualifier ( "Email" )
    private MessageValidator emailValidator;

    @Autowired
    @Qualifier ( "SMS" )
    private MessageValidator smsValidator;

    @Autowired
    @Qualifier ( "Telegram" )
    private MessageValidator telegramValidator;

    @Override
    public void processMessage (Message msg)  {
        boolean isValid = false ;
        if (msg instanceof SMSMessage) {
            isValid = smsValidator.validate(msg);
        } else if (msg instanceof EmailMessage) {
            isValid = emailValidator.validate(msg);
        } else if (msg instanceof TelegramMessage) {
            isValid = telegramValidator.validate(msg);
        }

        //do other processing
    }

当出现新的消息类型时,您必须再次更改此类以支持该新类型。 这种方法违反了开放封闭原则。

为了解决这个问题,我们使用Spring框架提供的ServiceLocatorFactoryBean支持新的验证,而无需更改现有代码,我们只需要创建更多的类来处理新消息类型的验证逻辑即可。

如您所见,下面的代码片段已大大缩短。

@Autowired
    private MessageValidatorFactory msgValidatorFactory;

    @Override
    public void processMessage (Message msg)  {
        boolean isValid = msgValidatorFactory.getMsgValidator(msg.getType()).validate(msg);

        //do other processing
    }
public interface MessageValidatorFactory  {
    MessageValidator getMsgValidator (String msgType) ;
}
@Configuration
public class BeanConfigs  {
    @Bean ( "validatorFactory" )
    public FactoryBean serviceLocatorFactoryBean ()  {
        ServiceLocatorFactoryBean factoryBean = new ServiceLocatorFactoryBean();
        factoryBean.setServiceLocatorInterface(MessageValidatorFactory.class);
        return factoryBean;
    }
}

配置仅帮助通过beanId查找bean,例如EmailSMSTelegram

@Component ( "Email" )
public class EmailMessageValidator implements MessageValidator  {
    @Override
    public boolean validate (Message m)  {
        //logic for validation
        return false ;
    }
}
@Component ( "SMS" )
public class SMSMessageValidator implements MessageValidator  {
    @Override
    public boolean validate (Message m)  {
        //logic for validation
        return false ;
    }
}
@Component ( "Telegram" )
public class TelegramMessageValidator implements MessageValidator  {
    @Override
    public boolean validate (Message m)  {
        //logic for validation
        return false ;
    }
}

通过这种方法,您的代码将看起来更加整洁,并且易于维护,从而减轻了在实现新功能时对旧功能的影响。

干杯

翻译自: https://hackernoon.com/open-closed-principle-with-service-locator-pattern-bb3f3voc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值