Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 替换util类的最佳模式_Java_Android_Design Patterns - Fatal编程技术网

Java 替换util类的最佳模式

Java 替换util类的最佳模式,java,android,design-patterns,Java,Android,Design Patterns,我有一个类似于util的类,它包含所有准备和调用请求(我希望轻松管理请求)。例: 但这种设计的问题是,在LoginFragment中,我可以调用Register request,而在RegisterFragment中,我可以调用Login request。那么,创建这个util类是一个糟糕的解决方案吗?是否有一种模式可以解决我的问题 那么,创建这个util类是一个糟糕的解决方案吗 Util类不会将处理委托给其他类。他们处理输入,进行一些计算并返回结果。在您的示例中,您将任务从util委托给服务类

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

但这种设计的问题是,在
LoginFragment
中,我可以调用
Register request
,而在
RegisterFragment
中,我可以调用
Login request
。那么,创建这个
util
类是一个糟糕的解决方案吗?是否有一种模式可以解决我的
问题

那么,创建这个util类是一个糟糕的解决方案吗

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

而且,UTIL不应该有业务逻辑。看看课堂

那么,创建这个util类是一个糟糕的解决方案吗

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


而且,UTIL不应该有业务逻辑。看看类。

其中一个解决方案可以是针对您的类的两个不同接口:

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());
    }
}
另一个解决方案可能只是两个单独的类来进行登录和注册


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

其中一个解决方案可以是您的类的两个不同接口:

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());
    }
}
另一个解决方案可能只是两个单独的类来进行登录和注册


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

为了避免在有60个API调用之后出现反模式,例如,您可以使用类似于
命令
设计模式的东西

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();

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

为了避免在您有60个API调用之后出现反模式,例如,您可以使用类似于
命令
设计模式的东西

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();

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

谢谢您的回复,但是如果有很多接口需要,这就不好了used@JohnSteve你能解释一下为什么这对你不好吗?在不同的类中,对象的行为只与您指定的接口的确切实例类似。我认为最好的选择是将所有关于请求的功能保留在一个类中,但只通过接口向客户端显示部分功能。@约翰斯蒂夫另一个选择是创建RequestManager的子类,并请求它们:RequestManager.provideLoginRequestManager(),它将是内部类(因此RequestManager的所有上下文对它都是可见的,但又被其他类屏蔽了)假设我有30个接口,作为您的实现,
RequestManager
必须实现太多的
接口
。谢谢!谢谢您的回复,但是如果有很多接口,那就不好了used@JohnSteve你能解释一下为什么它对你不好吗?在不同的类中,你的对象只起到t的一个精确实例的作用您已分配的接口。我认为最好的选择是将有关请求的所有功能保留在一个类中,但仅通过接口向客户端显示部分功能。@约翰斯蒂夫另一个选择是创建RequestManager的子类,并请求它们:RequestManager.provideLoginRequestManager(),这将是内部类(因此RequestManager的所有上下文对它都是可见的,但又被其他类屏蔽了)假设我有30个接口,就像你的实现一样,
RequestManager
必须实现太多的
接口
。谢谢!谢谢,你的答案对我来说是明确的。但是,假设这个类不是@Lebedevsd所说的
util
,你能建议我如何解决我的问题吗?我想把所有请求分组在一个类中。谢谢s、 你的答案对我来说是明确的。但是,假设这个类不是@Lebedevsd所说的
util
,你能建议我如何解决我的问题吗?我想将所有请求分组在一个类中。