2013-11-08 3 views
2

У меня есть интерфейс AuthenticationHandler, который поддерживает URLConnection, но теперь я использую Apache HTTP Client. Я хочу иметь общий интерфейс для аутентификации для обоих типов соединений (URLConnection и HTTP Client), но они оба имеют разные параметры и работают по-разному.Схема разработки стратегии

Как бы это создать? Является ли стратегия стратегией?

import java.net.URLConnection; 
import java.util.List; 

public interface AuthenticationHandler { 

/** 
* this needs to be called by everyone that needs direct access to a link which may have 
* security access rules. 
*/ 
void trustAll(); 

/** 
* 
* @param URLconnection where you set access state parameters or anything access related 
* @param slice where you could get access config 
* @param initializeSlice is true if you want the proxy to hibernate initialize all hibernated objects 
* @return 
* @throws ConnectionException 
*/ 
void authenticate(URLConnection conn) throws ConnectionException; 

List<String> getSingleCookie(); 

void setSingleCookie(List<String> singleCookies); 

CookieManager getCookieManager(); 

void setCookieManager(CookieManager cookieManager); 

boolean isKeepGeneratedCookie(); 

void setKeepGeneratedCookie(boolean keepGeneratedCookie); 

} 

Моя главная забота

void authenticate(URLConnection conn) throws ConnectionException; 

, где он был первоначально принимая URLConnection соед, но теперь мы хотим, чтобы добавить поддержку HTTP-клиента тоже.

ответ

5

Для шаблона стратегии вы должны использовать что-то вроде этого: пример

public class AuthenticationHandlerImpl implements AuthenticationHandler { 

    private Authenticator authenticator; 

    void authenticate() throws ConnectionException { 
     authenticator.authenticate(); 
    }; 

    public void setAuthenticator(final Authenticator authenticator){ 
     this.authenticator = authenticator; 
    } 

} 

interface Authenticator { 
    void authenticate(); 
    void setLogin(String login); 
    void setPassword(String password); 
} 

class URLAuthenticator implements Authenticator { 
    public void authenticate() { 
     //use URLConnection 
    }; 
} 

class HTTPClientAuthenticator implements Authenticator { 
    public void authenticate() { 
     //use HTTPClient 
    }; 
} 

Использование:

AuthenticationHandler handler = new AuthenticationHandlerImpl(); 
Authenticator authenticator = new HTTPClientAuthenticator(); 
//or 
//Authenticator authenticator = new URLAuthenticator(); 
authenticator.setLogin(...); 
authenticator.setPassword(...); 
handler.setAuthenticator(authenticator) 

handler.authenticate(); 

Для создания Authenticator вы можете использовать шаблон FactoryMathod:

class AuthenticatorFactory { 

    private AuthenticatorFactory(){} 

    //type of param may be enum or other 
    public static Authenticator createAuthenticator(... param) { 
     if (param == ...) { 
      return new URLAuthenticator(); 
     } else if (param == ...) { 
      return new HTTPClientAuthenticator(); 
     } 
    } 
} 
+1

Nice один , Измените AuthenticatorFactory как AuthenticatorContext и предоставьте все возможные реализации в конструкторе. Предоставьте метод getter, чтобы вернуть определенную стратегию. –

0

Вы можете перегрузить

void authenticate(HTTPClient client) throws ConnectionException; 

или вместо передавать потоки в/в качестве параметра или работать с целенаправленным обратным вызовом, как doLogin и передать что-то вроде полномочий.

Смежные вопросы