[英]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.