服務提供者框架筆記
阿新 • • 發佈:2018-11-03
服務提供者框架
服務提供者框架(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();
}
}