0

我有一个执行以下操作的网络服务:

  • 登录
  • 登出
  • 登记

createRequest()每个 web 服务仅在方法和方法的情况下传递的参数方面有所不同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 类,所有操作都定义为单独的静态方法。

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

4

2 回答 2

2

我会使用工厂模式来实现这个场景。我会有以下结构。

我会遵循选择器方法,其中选择器可以是login,logout等等registration。我将定义三个类来实现关注点分离,因为如果我将与这些操作相关的所有逻辑组合在单个类中并且如果我需要对任何提到的操作进行简单更改,我不想更改和测试整个代码。话虽如此,我有三个班级LoginHelperLogoutHelper并且RegistrationHelper

工厂类将具有所有三个类的实例,并且基于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;
    }
}
于 2013-10-14T12:24:10.587 回答
0

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

通过“链”,我的意思是“用户”操作需要用户名,并且应该首先执行(获取用户数据),然后调用“订阅”操作,同时将自身作为参数和/或它的用户数据(大概) 检索。

于 2013-10-15T10:43:24.980 回答