我有一个网络服务执行以下操作:
- 登录
- 退出
- 注册
每个 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 类,所有操作都定义为单独的静态方法。
请建议在这种情况下实现哪种设计模式。
最佳答案
我将使用工厂模式来实现这个场景。我会有以下结构。
我会遵循选择器方法,其中选择器可以是登录
、注销
、注册
等。我将定义三个类来实现关注点分离,因为如果我将与这些操作相关的所有逻辑组合在单个类中并且如果我需要对任何提到的操作进行简单的更改,我不想更改和测试整个代码。话虽如此,我有三个类 LoginHelper
、LogoutHelper
和 RegistrationHelper
。
工厂类将具有所有三个类的实例,并且基于选择器
我会将操作委托(delegate)给相关类。
此外,我正在谈论的工厂将包含 DAO 层的处理程序,并且如果需要,将向您的助手提供相同的处理程序。
在您的类中拥有工厂实例,您希望在其中委托(delegate)登录和注销等任务。 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;
}
}
关于java - Rest WebService 客户端应使用哪种设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19360038/