服务提供者框架笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Little_Red_Rose/article/details/83588578

服务提供者框架

服务提供者框架(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();
  }
}

猜你喜欢

转载自blog.csdn.net/Little_Red_Rose/article/details/83588578