在我理解的软件设计原则列表中,开放式封闭原则是最简单的一种。 “打开扩展,关闭修改”-这个想法似乎很简单。 让我们创建一个有关验证的示例。
我们提供的服务提供了将消息发送给收件人的功能。 消息的类型可以是SMS,电子邮件和电报等。这是这些消息类型的结构。
![](https://i-blog.csdnimg.cn/blog_migrate/2e4d2424c7c21026abf1423354348434.png)
显然,每种消息类型都有其自己的验证逻辑。 例如,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,例如Email
, SMS
, Telegram
@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