假设我有一个接口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。
我可以使用哪种设计模式来解决此问题?
最佳答案
创建一个Credentials
抽象类,以通过具体的APi实现进行扩展,并将其放入方法协定中。
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();
}