2013-02-02 8 views
2

가정하자 나는이 인터페이스를 구현하는 인터페이스 API 및 클래스 FacebookAPI 및 FlickrAPI이디자인 패턴

public interface API { 
    Photo getPhoto(int id); 
    Album getAlbum(int id); 
} 

package api; 

import domainObjects.Album; 
import domainObjects.Photo; 

public class FacebookAPI implements API{ 

    @Override 
    public Photo getPhoto(int id) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Album getAlbum(int id) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 


import domainObjects.Album; 
import domainObjects.Photo; 

public class FlickrAPI implements API{ 

    @Override 
    public Photo getPhoto(int id) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Album getAlbum(int id) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

문제는 난 단지 최소 두 API (페이스 북 및 플리커)에서이 필요하다는 것을 알고있다가 사진이 부착 된 신분증. 이제 사진을 얻으려면 Facebook APII에는 Id 외에 AccessToken이 필요하고 FlickAPI에는 photoId 이외에 APIKey + UserId가 필요합니다.

이 문제를 해결하기 위해 어떤 디자인 패턴을 사용할 수 있습니까?

답변

0

왜 마찬가지로 FacebookAPI 클래스

4

콘크리트 API 구현을 연장 할 수있는 Credentials 추상 클래스를 생성 및 방법 계약에 그것을 얻을이

public class FlickrAPI implements API{ 

    private String key; 
    private UserId id; 
    public FlickrAPI(String key, UserId id){ 
    this.key = key; 
    this.id = id; 
    //rest of initialzation 
    } 

} 

그런 짓을하지 못할.

public Album getAlbum(int id, Credentials c) { 

및 인증 방법 (URL 파라미터와 같은) 파라미터 변화와 유사한 경우에만 가능하다 이와 비슷하게

public FlickrCredentials extends Credentials { 
    String APIKey 
    String UserId 
} 

. 추상 클래스는 실제로 값을 사용하는 방법의 계약을 지정해야합니다, 뭔가 같은 :

로 예를 들어 구현 될 수
public String buildToken(); 

: 당신이 사용하고있는 언어

@Override 
public String buildToken() { 
    return "APIKey="+getAPIKey()+"&UserId="+getUserId(); 
} 
1

확실하지 않음 (목적 C)하지만 C#에서 그것을하는 경우에 당신은 제네릭 사용 싶어?

: 같을 것이다 그런 다음 클래스를

public interface API<TIdentifier> { 
    Photo getPhoto(TIdentifier id); 
    Album getAlbum(TIdentifier id); 
} 

public class FlickrIdentifier 
{ 
    public string ApiKey { get; set; } 
    public string UserId { get; set; } 
} 
:
public class FlickrAPI implements API<FlickrIdentifier> 
{ 
    @Override 
    public Photo getPhoto(FlickrIdentifier id) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Album getAlbum(FlickrIdentifier id) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

그런 다음 당신은 또한 FlickrIdentifier 클래스를 필요할 것