【问题标题】:Design pattern for flexible interface灵活接口的设计模式
【发布时间】:2013-01-17 12:52:14
【问题描述】:

假设我有一个接口 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 需要 AccessToken 和 Id,而 FlickAPI 需要 APIKey + UserId 和 photoId。

我可以使用什么设计模式来解决这个问题?

【问题讨论】:

    标签: java design-patterns interface


    【解决方案1】:

    创建一个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();
    }
    

    【讨论】:

      【解决方案2】:

      不确定您使用的是哪种语言(目标 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; }
      }
      

      【讨论】:

        【解决方案3】:

        你为什么不能这样做

        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 类也是如此

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-13
          • 1970-01-01
          • 1970-01-01
          • 2012-03-22
          • 1970-01-01
          • 2019-10-02
          • 1970-01-01
          • 2018-01-20
          相关资源
          最近更新 更多