避免java中的重复服务调用

8yparm6h  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(372)

我有以下服务课程:
accountservice类:

public class AccountService {
    public createAccount(argumentsList1);
    public closeAccount(argumentsList2);
    //many other methods
}

servicehandler类:

public class ServiceHandler {//ServiceHandler is singleton

    SavingsAccountService savingsAccountService;//SavingsAccountService implements AccountService

    LoanAccountService loanAccountService;//LoanAccountService implements AccountService

    public AccountService getService(boolean isSavings) {
        if(isSavings) {
            return savingsAccountService;
        } else {
            return loanAccountService;
        }
    }
}

另外,我有很多不同类型的服务,比如 ABCService , XYZService 等等。。哪个调用 ServiceHandler 首先获取accountservice的运行时对象,然后调用相应的方法,如下例所示:
ABC服务类:

public class ABCService {
    public void process1(boolean isSavingsAccount, a, b, c, arguments..) {
        AccountService accountService = ServiceHandler.getService(isSavingsAccount);
        accountService.createAccount(argumentsList1);
    }
}

XYZ服务类:

public class XYZService {
    public void process2(boolean isSavingsAccount, d, e, f, argumemts...) {
        AccountService accountService = ServiceHandler.getService(isSavingsAccount);
        accountService.closeAccount(argumentsList2);
    }
}

还有很多其他服务,比如 PQRService (类似于 ABCService , XYZService )等等。。在这里,我不喜欢把电话复制到 ServiceHandler.getService(isSavingsAccount) 所有其他服务(如 ABCService ,等…)首先获取句柄,然后进一步调用所需的方法 createAccount() , closeAccount() 等等。。我怎样才能揭露 AccountService 通过 ServiceHandler 自己(以便我可以打电话 createAccount() 只有一行代码?请注意 ServiceHandler 是单例类,应该是线程安全的。
是否有任何特定的设计模式,我可以用来消除上述重复?

ua4mk5z4

ua4mk5z41#

只需使用 Dependency Injection 原理
使您的所有服务都依赖于超类型 AccountService 计算 getService(isSavings) 只有一次来确定所需的混凝土 AccountService 伊蒂尔 SavingsAccountService 或者 LoanAccountService 运行时
将此注入到您的服务中
更多说明的示例代码
ABC服务类:

public class ABCService {
    // inject the service using constructor or setter method
    private AccountService accountService;

    public void process1(a, b, c, arguments..) {
        accountService.createAccount(argumentsList1);
    }
}

XYZ服务类:

public class XYZService {
    // inject the service using constructor or setter method
    private AccountService accountService;

    public void process1(d, e, f, argumemts...) {
        accountService.closeAccount(argumentsList1);
    }
}

提示:
如果你需要客户通过 isSavings 每次运行时都使用布尔参数,因此您的解决方案符合要求
主要是你申请的 Factory method Design pattern ,只需重命名 ServiceHandler 类到 AccountServiceFactory 更具可读性

相关问题