2013-02-02 95 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和Flickr)要求PHOTOID。現在假設要獲取照片FacebookAPI除了需要Id外還需要AccessToken,而FlickAPI除了需要PhotoId外還需要APIKey + UserId。

我可以用什麼設計模式來解決這個問題?

回答

0

爲什麼不能你同樣的FacebookAPI類

4

創建Credentials抽象類通過具體API的實現進行擴展,並獲得在法合同做這樣的事情

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) { 

相若方式和

public FlickrCredentials extends Credentials { 
    String APIKey 
    String UserId 
} 

即僅可行的,如果所述認證方法與改變參數(如URL參數)類似。抽象類應實際使用值指定方法的合同,是這樣的:

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 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類:

public class FlickrIdentifier 
{ 
    public string ApiKey { get; set; } 
    public string UserId { get; set; } 
}