服务提供者框架
服务提供者框架主要有三个主体部分:服务接口,服务注册API,服务访问API,同时还有可选部分,如服务提供者,其中JDBC便用到该框架模式。该框架用于多个服务提供方实现同个服务的情景下,只要定义好服务接口规范,当有新的服务提供者时,只需要按规范实现接口即可,具有良好的扩展性,耦合度低。
以下以交通服务为例子进行介绍,其中TrafficService为服务接口,TrafficStation.registerTrafficService为服务注册API,TrafficStation.getTrafficService为服务访问API,XXXService为服务接口的实现类。
服务接口
定义服务的规范,TrafficService接口定义了三种服务规范。
package serviceapi;
/**
* 交通服务接口
* @author Administrator
*
*/
public interface TrafficService {
/**
* 市内出行
*/
public void travelInCity();
/**
* 国内出行
*/
public void travelInCountry();
/**
* 国际出行
*/
public void travelAroundWorld();
}
服务注册API
提供了注册服务的编程接口,本例中的服务注册API为TrafficStation.registerTrafficService。注:TrafficStation为工具类,提供了服务注册和服务访问的方法。
public static void registerTrafficService(TrafficService service) {
trafficServices.put(service.getClass().getSimpleName(), service);
}
服务访问API
提供访问服务的编程接口,本例中的服务访问API为TrafficStation.getTrafficService。
public static TrafficService getTrafficService(String serviceName)
throws NoSuchServiceException {
TrafficService trafficService = trafficServices.get(serviceName);
if (trafficService == null) {
throw new NoSuchServiceException();
} else {
return trafficService;
}
}
服务接口实现类
参考JDBC写法
AirPlaneService
package serviceprovider;
import serviceapi.TrafficService;
import servicemanager.TrafficStation;
public class AirPlaneService implements TrafficService{
static {
// 类装载时创建实例并注册服务
TrafficStation.registerTrafficService(new AirPlaneService());
}
public AirPlaneService() {
}
@Override
public void travelInCity() {
System.out.println("travel in city, speed is 360 km/h, cost 1/4 hour");
}
@Override
public void travelInCountry() {
System.out.println("travel in country, speed is 360 km/h, cost 30 hour");
}
@Override
public void travelAroundWorld() {
System.out.println("travel in city, speed is 360 km/h, cost 3000 hour");
}
}
BusService
package serviceprovider;
import serviceapi.TrafficService;
import servicemanager.TrafficStation;
public class BusService implements TrafficService {
static {
TrafficStation.registerTrafficService(new BusService());
}
public BusService() {
}
@Override
public void travelInCity() {
System.out.println("travel in city, speed is 36 km/h, cost 3 hour");
}
@Override
public void travelInCountry() {
System.out.println("travel in country, speed is 36 km/h, cost 360 hour");
}
@Override
public void travelAroundWorld() {
System.out.println("travel in city, speed is 36 km/h, cost 36000 hour");
}
}
TrainService
package serviceprovider;
import serviceapi.TrafficService;
import servicemanager.TrafficStation;
public class TrainService implements TrafficService {
static {
TrafficStation.registerTrafficService(new TrainService());
}
public TrainService() {
}
@Override
public void travelInCity() {
System.out.println("travel in city, speed is 90 km/h, cost 1 hour");
}
@Override
public void travelInCountry() {
System.out.println("travel in country, speed is 90 km/h, cost 120 hour");
}
@Override
public void travelAroundWorld() {
System.out.println("travel in city, speed is 90 km/h, cost 12000 hour");
}
}
测试代码
public static void main(String[] args) {
try {
// 装载服务接口实现类
Class.forName("serviceprovider.AirPlaneService");
Class.forName("serviceprovider.TrainService");
Class.forName("serviceprovider.BusService");
TrafficService trafficService = TrafficStation.getTrafficService("BusService");
trafficService.travelAroundWorld();
trafficService.travelInCountry();
trafficService.travelInCity();
System.out.println("");
trafficService = TrafficStation.getTrafficService("TrainService");
trafficService.travelAroundWorld();
trafficService.travelInCountry();
trafficService.travelInCity();
System.out.println("");
trafficService = TrafficStation.getTrafficService("AirPlaneService");
trafficService.travelAroundWorld();
trafficService.travelInCountry();
trafficService.travelInCity();
System.out.println("");
} catch (ClassNotFoundException | NoSuchServiceException e) {
e.printStackTrace();
}
}
输出结果
travel in city, speed is 36 km/h, cost 36000 hour
travel in country, speed is 36 km/h, cost 360 hour
travel in city, speed is 36 km/h, cost 3 hour
travel in city, speed is 90 km/h, cost 12000 hour
travel in country, speed is 90 km/h, cost 120 hour
travel in city, speed is 90 km/h, cost 1 hour
travel in city, speed is 360 km/h, cost 3000 hour
travel in country, speed is 360 km/h, cost 30 hour
travel in city, speed is 360 km/h, cost 1/4 hour
Java SPI
java已经提供了成熟的服务提供者框架:java.util.ServiceLoader,详见其他作者的文章:
Java SPI