java - 对象继承 - 重构问题 - 创建灵活服务的可能性
问题描述
这应该很容易,但显然我缺乏基本知识。BugTracking
我有一项服务可以在系统中创建票证。创建插件非常简单。有一个接口
public interface BugTracker {
boolean createAndSendIssue(Issue issue);
boolean updateAndSendIssue(Issue issue);
boolean closeIssue(Issue issue);
}
和 JIRA 的 API 客户端:
@Component
public class JiraClient implements BugTracker {
@Override
public boolean createAndSendIssue(Issue issue) {
//Logic for using JIRA REST API
return false;
}
@Override
public boolean updateAndSendIssue(Issue issue) {
//Logic for using JIRA REST API
return false;
}
@Override
public boolean closeIssue(Issue issue) {
//Logic for using JIRA REST API
return false;
}
}
Bugzilla 的 API 客户端:
@Component
public class BugzillaClient implements BugTracker {
@Override
public boolean createAndSendIssue(Issue issue) {
//Logic for using BUGZILLA REST API
return false;
}
@Override
public boolean updateAndSendIssue(Issue issue) {
//Logic for using BUGZILLA REST API
return false;
}
@Override
public boolean closeIssue(Issue issue) {
//Logic for using BUGZILLA REST API
return false;
}
}
Service
处理中出现问题MVC
。它的一部分看起来像:
@Service
public class BugTrackerService {
private final BugzillaClient bugzillaClient;
private final JiraClient jiraClient;
private static final String JIRA_TYPE = "Jira";
private static final String BUGZILLA_TYPE = "Bugzilla";
@Autowired
BugTrackerService(BugzillaClient bugzillaClient, JiraClient jiraClient) {
this.bugzillaClient = bugzillaClient;
this.jiraClient = jiraClient;
}
boolean processIssueTicketRequest(Issue issue){
if ( issue.getBugTrackerType().bugTrackingSystemType.name.equals(JIRA_TYPE)) {
return jiraClient.createAndSendIssue(issue);
} else if (issue.getBugTrackerType().bugTrackingSystemType.name.equals(BUGZILLA_TYPE)){
return bugzillaClient.createAndSendIssue(issue);
} else {
return false;
}
}
}
是否有可能在BugTrackerService.processIssueTicketRequest
没有所有客户端自动装配的情况下创建方法?目前这不是什么大问题,但在与越来越多的系统集成后,这项服务将变得复杂。
解决方案
根据您希望实现的可重用程度,我可能会将检查给定问题是否匹配输入的逻辑放入接口中,例如
boolean canWorkWithGivenIssue(Issue issue);
有了这些,您就不需要知道您发送的跟踪器的实际类型,只需将它们汇总到列表中即可。如果您使用 @Autowired 注释集合,Spring 将为您执行此操作,在这种情况下,它将为您提供所有具有匹配类型的 bean。您的服务可能看起来像这样
@Autowired List<BugTracker> trackers; //autowired on field for brevity
boolean processIssueTicketRequest(Issue issue){
for (BugTracker t : trackers)
if (t.canWorkWithGivenIssue(issue))
return t.createAndSendIssue(issue);
return false;
}
推荐阅读
- python-3.x - 如何使用 DICT 数据类型 (boto3) 更新 DynamoDB 表
- python - 在服务器重新启动时清除 Django webapp 的所有会话
- c# - 泛型类型作为必须实现特定接口的参数
- html - 如何在新行上创建跨度?
- javascript - 任何可以创建用户友好的 unqiue id 的 npm 模块?
- pubnub - PubNub 使用 REST API 授予身份验证密钥
- excel - 仅为当前日期保存多个电子邮件附件
- arrays - 我如何使用(向右移动)对我的数组进行排序
- ruby-on-rails - 一个 simple_form 可以创建多个模型的实例吗?
- php - php页面在centos中使用nginx php-fdm返回**404 Not Found**