java

时间:2017-02-16 05:22:03

标签: java http design-patterns solid-principles

我正在开发一个正在制作大量网络请求的Android应用程序。我想以这样的方式设计我的应用程序: -

  1. 我所有与网络相关的任务都集中在一个单独的类中,每当我想要发出请求时,我都应该实例化该类并提出我的请求。基本上我不想通过网络电话污染我的活动。

  2. 设计应该是这样的,如果将来我想要更改我用于网络调用的库(okhttp,retrofit,async等)我不需要做很多代码更改或者如果有的话任何代码更改都必须在一个类中,活动不应该分辨出来。我应该能够通过最少的代码更改来更改我正在使用的库。

  3. 我想尽可能遵循SOLID原则。

  4. 该课程应该是单元可测试的。如果我想测试使用此类参数或方法的任何其他类,我应该很容易模拟。

  5. 我有一些想法,我不想要任何代码示例,我只需要你们的一些建议,这样我就可以从应用程序开发的最初阶段就遵循最好的设计实践。

    谢谢

3 个答案:

答案 0 :(得分:0)

我认为你可以创建一个类Requester这个类有一个属性来保存通信库对象,这个属性类型是一个接口,它应该是通信库的包装器,所以在这里你可以实现一个策略图案。

您的请求者类应该只进行网络调用,并且有效负载应该传递给您的函数。

希望这会对你有所帮助。

答案 1 :(得分:0)

  
      
  1. 我所有与网络相关的任务都集中在一个单独的类中   无论何时我想发出请求,我都应该实例化该类   并提出我的要求。基本上我不想污染我的活动   通过网络电话。
  2.   

我相信你有一个用于保存常量的类,我们可以自己使用它。

您可以做的是创建一个类并使用应用程序加载实例化它。您的代码可能如下所示:

public class Constants {
    // Your code.
    static {
        instantiateNetworkHelper();
    }

    public static NetworkHelper netowrkHelper = null;

    private static void instantiateNetworkHelper() {
        /* implementation */
    }
}

这样,您只需创建一个辅助类的实例,您可以在应用程序的任何位置使用它......

  
      
  1. 设计应该是这样的,如果将来我想要更改我用于网络调用的库(okhttp,retrofit,async等)   我不需要做很多代码更改或者是否有任何代码更改   他们都必须在一个班级,活动不应该分辨   区别。我应该能够改变我的库   使用最少的代码更改。
  2.   

您可以使用上面的实现,但这一次,您可以使用抽象的概念。您可以创建一个执行网络调用的抽象类,您可以创建抽象方法来获取网络协议或您想要配置/更改的任何内容。一个例子如下:

public abstract class NetworkHelper {
    public void doNetworkCall() {
        String protocol = getProtocol();
        /* implementation */
    }

    protected String getProtocol();
}

通过这种方式,您可以拥有多个NetworkHandler,例如,每个都有助于处理特定协议,您也可以通过创建实现或使用现有协议对它们进行单元测试。

答案 2 :(得分:0)

您可以做的第一件事是设计一个代表您需要的操作的接口,然后为您正在使用的库创建一个实现,例如:

interface NetworkService {
    void getRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler);
    void postRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler);
}

class AsyncNetworkService {

    AsyncImpl networkImpl;//injected so can ne mocked

    void getRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler){
        //async specific implementation
    }
    void postRequest(String url, List<RequestParameter> parameterList, Handler<Response> handler){
        //async specific implementation
    }

}