Rest Web Service Client使用哪种设计模式?

时间:2013-10-14 12:14:46

标签: java web-services design-patterns

我有一个web服务执行以下操作:

  • 登录
  • 注销
  • 注册

每个网络服务仅在createRequest()方法和processResponse()方法传递的参数方面有所不同。

public Map<String, String> SubscriberLogin(String username ,String password ,   String addInfoData)
{

        Map<String, String> returnMap = new HashMap<String, String>();
        try {
            Map<String,String> paramMap = new HashMap<String, String>();
            paramMap.put("userIdentity", username);
            paramMap.put("password", password);

// Every webservice varies in value of Rest_WsConstants(webservice path) and paramMap-key/value mapping 
            HttpPost postReq = createRequest(Rest_WsConstants.LOGIN_WS.path, paramMap);

            StringEntity entity = new StringEntity(addInfoData);
            postReq.setEntity(entity);

            HttpResponse wsResponse = wsClient.execute(postReq);

            returnMap = processResponse(wsResponse);

        }catch (Exception e) {
            Logger.logError(MODULE,"Error while login, reason:"+e.getMessage());
        }
        return returnMap;
}

但是目前只有一个Singleton类,所有操作都被定义为单独的静态方法。

请建议在这种情况下实施哪种设计模式。

2 个答案:

答案 0 :(得分:2)

我会使用Factory Pattern来实现这个场景。我会有以下结构。

我会遵循选择器方法,其中选择器可以是loginlogoutregistration等等。我将定义三个类来实现关注点分离,因为如果我将所有与这些操作相关的逻辑组合在单个类中并且如果我需要在任何上述操作中进行简单更改,我就不想更改和测试整个代码。所以说我有三个课LoginHelperLogoutHelperRegistrationHelper

工厂类将拥有所有三个类的实例,并基于selector我将操作委托给相关的类。

我所说的工厂也会包含DAO处理程序,如果需要,也会为你的帮助程序提供相同的工具。

在您的班级中拥有您想要委派登录和注销等任务的工厂实例。factory.processRequest("login", "passAdditionInformationIfYouWantLikeRequestEtc.");


interface UserActivity{
    void processResponse(); 
}

class LoginHelper implements UserActivity{
    public void processResponse() { /*write logic*/ }   
}

class LogoutHelper implements UserActivity{
    public void processResponse() { /*write logic*/ }   
}    

class Factory{
    private UserActivity login = new LoginHelper();
    private UserActivity logout = new LogoutHelper();

    //Call this method by passing selector
    public UserActivity processRequest(String selector) {
        UserActivity activityHandler = null;
        if(selector.equals("login")){
            activityHandler = this.login;
        }else if(selector.equals("logout")){
            activityHandler = this.logout;
        }
        return activityHandler;
    }
}

答案 1 :(得分:0)

如果要实现基于树的结构(/ users / USERNAME / subscriptions以显示名为USERNAME的用户的订阅信息),您可能需要查看责任链。使用Factory创建个人动作的建议是一个很好的建议,所以坚持下去,除非你希望能够链接动作。

通过“链”我的意思是“用户”操作需要USERNAME,并且应该首先执行(获取用户数据),然后在将自身作为参数和/或用户数据传递时调用“subscriptions”操作它(可能)检索。