簡體   English   中英

靈活界面的設計模式

[英]Design pattern for flexible interface

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

不知道您使用的是哪種語言(目標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; }
}

你為什么不能做這樣的事情

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類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM