替换util类

时间:2016-12-27 10:00:05

标签: java android design-patterns

我有一个class,如util,它包含所有准备和调用请求(我希望能够轻松管理请求)。例如:

public void reqLogin(String emailAddress, String password) {
    JsonRequestBody parameters = new JsonRequestBody();
    parameters.put(USER_NAME, emailAddress);
    parameters.put(PASSWORD, password);
    mService.login(parameters.createRequestBody());
}
public void reqRegister(LocationWrapper location) {
    JsonRequestBody jsonRequestBody = new JsonRequestBody();
    jsonRequestBody.put(DEVICE_TOKEN, "myToken");
    jsonRequestBody.put(DEVICE_TOKEN_TYPE, "type");
    mService.register(jsonRequestBody.createRequestBody());
}

... 

但是这个设计的问题在于LoginFragment我可以拨打Register request,在RegisterFragment我可以拨打Login request。那么,创建这个util类是不好的解决方案?是否有一种模式可以解决我的issue

3 个答案:

答案 0 :(得分:2)

  

那么,创建这个util类是不好的解决方案呢?

Util类不会将处理委托给其他类。他们处理输入,进行一些计算并返回结果。在您的示例中,您将任务委派给来自util的服务类。那是不对的。相反,服务类应该调用util方法。

而且,Utils不应该有业务逻辑。看看Math班。

答案 1 :(得分:1)

例如,要在60个API调用之后避免GodObject反模式,您可以使用类似Command设计模式的内容。

interface APIOperation {
    void execute();
}

class LoginAPIOperation implements APIOperation {
    private final String mEmail, mPass;

    public LoginAPIOperation(String emailAddress, String password) {
        mEmail = emailAddress;
        mPass = password;
    }

    public void execute() {
        JsonRequestBody parameters = new JsonRequestBody();
        parameters.put(USER_NAME, mEmail);
        parameters.put(PASSWORD, mPass);
        mService.login(parameters.createRequestBody());
    }
}

new LoginAPIOperation("user@gmail.com","qwerty").execute();

您可以在不同的类中重复使用它。

答案 2 :(得分:0)

其中一个解决方案可能是您班级的2个不同界面:

class RequestManager implemets LoginRequest, RegistrationRequest{
    @Override //method from LoginRequest
    public void reqLogin(String emailAddress, String password) {
       JsonRequestBody parameters = new JsonRequestBody();
       parameters.put(USER_NAME, emailAddress);
       parameters.put(PASSWORD, password);
       mService.login(parameters.createRequestBody());
    }
    @Override //method from RegistrationRequest
    public void reqRegister(LocationWrapper location) {
       JsonRequestBody jsonRequestBody = new JsonRequestBody();
       jsonRequestBody.put(DEVICE_TOKEN, "myToken");
       jsonRequestBody.put(DEVICE_TOKEN_TYPE, "type");
       mService.register(jsonRequestBody.createRequestBody());
    }
}

其他解决方案可能只是2个单独的类进行登录和注册。

如上所述,这个类不是Utils类,它更像是网络处理器或请求管理器。