1. 程式人生 > >服務提供者框架筆記

服務提供者框架筆記

服務提供者框架

服務提供者框架(Service Provider Framework):多個服務提供者實現一個服務,系統為服務提供者的客戶端提供多個實現,並把他們從多個實現中解耦出來;例如JDBC,JMS。

服務元件

  • Service Interface: 服務介面,將服務通過抽介面統一宣告,供客戶端呼叫,由各個服務提供者具體實現。
  • Service Sccess API: 服務訪問API,使用者客戶端獲取相應的服務。
  • Provider Registration API: 這是系統用來註冊實現的,讓客戶端訪問他們的;註冊系統服務提供者,使得客戶端可以訪問它的實現。
  • Service Provider Interface: 這些服務提供者負責建立其服務實現的例項(非必須);如果沒有提供該介面,就按照類名稱註冊,並通過反射的方式進行例項化。

JDBC舉例

  • Connection
  • DriverManager.getConnection
  • DriverManager.registerDriver
  • Driver

程式碼舉例

本處程式碼拿鹽的生產舉例。

鹽(Service Interface)

/*
* @author zhangehb
* @function 食鹽
* Since 20.18-10-31
* 服務介面,將服務通過抽象統一宣告,供客戶端呼叫、由各個服務提供者具體實現。
* */
public interface Salt {
/**
 * 功能描述: 加點
 * @param:
 * @return:
 * @since: 1.0.0
 * @Author:zhangehb
 * @Date: 2018/10/31 16:33
 */
void addIodine();
}

海鹽與內陸鹽代表服務提供者自己的實現

/**
 * @ClassName BaySalt
 * @Description TODO 海鹽
 * @Author zhangehb
 * @Date 2018/10/31 16:34
 * @Version 1.0
 */
public class BaySalt implements Salt{
  @Override
  public void addIodine() {
    //  加碘操作
    System.out.println("海鹽");
  }
}



/**
 * @ClassName InlandSalt
 * @Description TODO 內陸鹽
 * @Author zhangehb
 * @Date 2018/10/31 16:37
 * @Version 1.0
 */
public class InlandSalt implements Salt {
   @Override
   public void addIodine() {
     //  加碘操作
     System.out.println("內陸鹽");
   }
}

服務訪問API(Service Provider Interface)

/*
* 服務提供者介面,這些服務提供者負責建立其服務實現的例項
* */
public interface SaltProvider {
   Salt getSalt();
}

提供者實現

/**
 * @ClassName BaySaltProvider
 * @Description TODO 海鹽廠商
 * @Author zhangehb
 * @Date 2018/10/31 16:42
 * @Version 1.0
 */
public class BaySaltProvider implements SaltProvider {
/*
 * 去鹽司登記
 * */
  static {
    SaltManager.registerProvider("baySaltProvider", new BaySaltProvider());
  }

  @Override
  public Salt getSalt() {
    //  太陽晒
   return new BaySalt();
  }
}


/**
 * @ClassName InlandSaltProvider
 * @Description TODO
 * @Author zhangehb
 * @Date 2018/10/31 16:44
 * @Version 1.0
 */
public class InlandSaltProvider implements SaltProvider {
/*
 * 去鹽司登記
 *
 * */
  static {
     SaltManager.registerProvider("inlandSaltProvider", new InlandSaltProvider());
  }

  @Override
  public Salt getSalt() {
     // 用挖掘機挖
     return new InlandSalt();
  }
}

鹽監司(Provider Registration API與Service Access API)

/**
 * @ClassName SaltManager
 * @Description TODO 鹽監司
 * @Author zhangehb
 * @Date 2018/10/31 16:46
 * @Version 1.0
 */
public class SaltManager {

/*
* 食鹽生產廠家登記檔案
* */
 private static final Map<String,SaltProvider> PROVIDER_MAP = new ConcurrentHashMap<>();

/*
* 食鹽廠商登記
* 服務提供者註冊API,用於系統註冊服務提供者,使得客戶端可以訪問它實現的服務。
* */
 public static void registerProvider(String  name,SaltProvider provider){

    PROVIDER_MAP.put(name,provider);
  }

/*
*
* 獲取食鹽
* 服務訪問API,使用者客戶端獲取相應的服務。
* */
 public static Salt getSalt(String name){

   SaltProvider saltProvider = PROVIDER_MAP.get(name);
   if (saltProvider == null){
      throw  new IllegalArgumentException("No     SaltProvider registered with name :"+name);
   }
    return saltProvider.getSalt();
  }
}

客戶端

/**
 * @ClassName Test
 * @Description TODO
 * @Author zhangehb
 * @Date 2018/10/31 16:53
 * @Version 1.0
 */
public class Test {
public static void main(String[] args) throws ClassNotFoundException{

  Class.forName("ServiceProviderFramework.InlandSaltProvider");
  Salt salt = SaltManager.getSalt("inlandSaltProvider");
  salt.addIodine();
  }
}