开发者社区> 问答> 正文

对象继承-重构问题-创建灵活服务的可能性

这应该很容易,但是显然我缺乏基本知识。我有一项服务,可以在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 CLient:

@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没有自动连接所有客户端的情况下创建方法?目前,这不是什么大问题,但是在与越来越多的系统集成之后,该服务将变得复杂。

java spring 重构

展开
收起
垚tutu 2019-11-28 19:33:59 961 0
1 条回答
写回答
取消 提交回答
  • #include

    将类型转换为,enum然后BugTracker决定是否可以处理。然后注入所有BugTracker实例的集合,遍历它们,如果它支持类型,则调用适当的方法。

    public enum SystemType { JIRA, BUGZILLA }
    
    

    然后添加一个方法,例如supports(Issue issue),你的BugTracker。

    boolean supports(Issue issue)
    ;```  
    
    在实现中检查它是否可以处理,例如,JiraClient执行类似的操作。
    ```js
    public boolean supports(Issue issue) {
      return JIRA == issue.getBugTrackerType();
    }
    
    

    然后在BugTrackerService所有BugTracker实例的列表中,进行迭代并调用适当的实例。

    @Service
    public class BugTrackerService {
    
        private final List<BugTracker> bugTrackers;
    
        BugTrackerService(List<BugTracker> bugTrackers) {
            this.bugTrackers=bugTrackers;
        }
    
        boolean processIssueTicketRequest(Issue issue){
            for (BugTracker bugTracker : this.bugTrackers) {
                if (bugTracker.supports(issue) ) {
                    bugTracker.createAndSendIssue(issue);
                    return true;
                }
            }
            return false;
        }
    }
    
    

    现在,您可以随心所欲地灵活工作,并且可以支持任意数量的支持。

    2019-11-28 19:34:45
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
快速变化背景下,组织如何保持过程的稳定性 立即下载
快速变化背景下,组织如何保持过程的稳定性? 立即下载