`

Effective Java(一)之服务提供者框架

阅读更多

 一、概念

 

       什么是服务提供者框架?

       多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把他们从多个实现中解耦出来(来自百科)。是不是很晦涩呀,其实简单说来就是:提供者为框架的用户提供了多个API实现,框架必须提供一种机制来注册这些实现以便用户能够使用它们;框架的客户直接使用API,无需关心自己到底在使用哪个实现。

 

二、实现原理

 

一般有三个组件组成:

1、服务接口(Service Interface),由服务提供者实现。

2、提供者注册API(Provider Registration API),这是系统用来注册实现,让客户端访问他们的。

3、服务访问API(Service Access API),是客户端用来获取服务的实例的。

4、(可选) 服务提供者接口(Service Provider Interface),这些服务提供者负责创建其服务实现的实例。如果没有Service Provider Interface,可以通过类名进行注册,并通过反射进行实例化。

       下面用UML中的类图表示其中的关系:(对图我就不做说明了,可以对照下面的代码看)

 

 

三、案例

 

      例如JDBC(Java数据库连接,Java Database Connectivity)API。

 

四、自己写的Demo

        1、服务接口(Service Interface)

            服务者接口

             

package com.lzw.service;
/**
 * 服务者接口
 */
public interface IService {
	/**
	 * 实现方法doService4Test1()
	 */
    public void doService4Test1();  
    /**
	 * 实现方法doService4Test2()
	 */
    public void doService4Test2();  
}

 

            服务者实现类

    

package com.lzw.service.impl;

import com.lzw.service.IService;
/**
 * 服务者接口实现类
 */
public class ServiceImpl implements IService {
	/**
	 * 实现方法doService4Test1()
	 */
	public void doService4Test1() {
		System.out.println("do service for test1 ...");
	}
	/**
	 * 实现方法doService4Test2()
	 */
	public void doService4Test2() {
		System.out.println("do service for test2 ...");
	}
	
}

 

       

          2、提供者注册API(Provider Registration API)

             提供者接口

    

package com.lzw.provider;

import com.lzw.service.IService;

/**
 * 
 * 提供者接口
 *
 */
public interface IProvider {
	/**
	 * 
	 * 關聯IService,用來獲取服務者接口(一般用來實現面向接口的編程)
	 */
	public IService getService();
}

 

            提供者实现类

   

package com.lzw.provider.impl;

import com.lzw.manager.ServiceManager;
import com.lzw.provider.IProvider;
import com.lzw.service.IService;
import com.lzw.service.impl.ServiceImpl;
/**
 * 
 * 提供者接口的实现类
 *
 */
public class ProviderImpl implements IProvider {
	/**
	 * 实现静态的注册
	 */
	private static final String DEFAULT_PROVIDER = "test";
	static {
		ServiceManager.registerProvider(DEFAULT_PROVIDER, new ProviderImpl());
	}

	/**
	 * 
	 * 關聯IService,用來獲取服務者接口(一般用來實現面向接口的編程)
	 */
	public IService getService() {
		return new ServiceImpl();
	}

}

 

 

         3、服务访问API(Service Access API)

             服务访问管理类 

    

package com.lzw.manager;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.lzw.provider.IProvider;
import com.lzw.service.IService;

public class ServiceManager {
	/**
	 * 私有无参数构造器
	 */
	private ServiceManager() {

	}

	/**
	 * 
	 */
	private static final Map<String, IProvider> providers = new ConcurrentHashMap<String, IProvider>();

	public static void registerProvider(String name, IProvider p) {
		providers.put(name, p);
	}
	/**
	 * 
	 * 关联IService,通过提供者来获取服务者接口
	 * 
	 * 	 */
	public static IService getService(String name) {

		IProvider p = providers.get(name);

		if (p == null) {
			throw new IllegalArgumentException(
					"No provider registered with name:" + name);
		}

		return p.getService();

	}

}

 

          4、客户端测试类

   

package com.lzw;

import com.lzw.manager.ServiceManager;
import com.lzw.service.IService;
/**
 * 
 * 客户端测试类
 *
 */
public class Client {
	/** 
     * @param args 
     * @throws ClassNotFoundException  
     */  
    public static void main(String[] args) throws ClassNotFoundException {  
          
        Class.forName("com.lzw.provider.impl.ProviderImpl");  
        IService service = ServiceManager.getService("test");  
        service.doService4Test1();
        service.doService4Test2();
    }  
}

        一大早起来到现在总算把这个笔记写完了,Congratulation!

  • 大小: 38.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics