服务提供者框架(Service Provider Framework)

服务提供者框架

服务提供者框架主要有三个主体部分:服务接口服务注册API服务访问API,同时还有可选部分,如服务提供者,其中JDBC便用到该框架模式。该框架用于多个服务提供方实现同个服务的情景下,只要定义好服务接口规范,当有新的服务提供者时,只需要按规范实现接口即可,具有良好的扩展性,耦合度低。
以下以交通服务为例子进行介绍,其中TrafficService服务接口TrafficStation.registerTrafficService服务注册APITrafficStation.getTrafficService服务访问API,XXXService为服务接口的实现类。

服务接口

定义服务的规范,TrafficService接口定义了三种服务规范。

package serviceapi;

/**
 * 交通服务接口
 * @author Administrator
 *
 */
public interface TrafficService {
	/**
	 * 市内出行
	 */
	public void travelInCity();
	/**
	 * 国内出行
	 */
	public void travelInCountry();
	/**
	 * 国际出行
	 */
	public void travelAroundWorld();
}

服务注册API

提供了注册服务的编程接口,本例中的服务注册APITrafficStation.registerTrafficService注:TrafficStation为工具类,提供了服务注册和服务访问的方法。

public static void registerTrafficService(TrafficService service) {
		trafficServices.put(service.getClass().getSimpleName(), service);
	}

服务访问API

提供访问服务的编程接口,本例中的服务访问APITrafficStation.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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值