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 が必要であるとします。

この問題を解決するには、どのデザイン パターンを使用できますか?

4

3 に答える 3

4

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();
}
于 2013-02-02T06:38:58.873 に答える
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; }
}
于 2013-02-02T06:41:45.020 に答える
0

なぜあなたはこのようなことをすることができないのですか

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
  }

}

FacebookAPIクラスについても同様です

于 2013-02-02T06:37:45.067 に答える