假设我有一个接口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();
}

10-07 20:40