`
aine_pan
  • 浏览: 44860 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

服务提供者框架 《Effective Java 一》

阅读更多
引入:静态工厂方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以并不存在,这种灵活的静态工厂方法构成了服务提供者框架的基础。——引自effectivejava
服务提供者框架中有三个重要组件:服务接口(Service Interface),由服务提供者实现;提供者注册API(Provider Registration API),这是系统用来注册实现,让客户端访问他们的;服务访问API(Service Access API),是客户端用来获取服务的实例的。

服务提供者框架的第四个组件是可选的:服务提供者接口(ServiceProviderInterface),这些提供者负责创建其服务实现的实例。如果没有服务提供者接口,实现就按照类名称注册,并通过反射方式进行实例化。--转

看似简单,不仔细想想也是不行的。服务提供者框架,我理解涉及到三方面角色,一个是系统服务,他只负责提供服务,却不提供具体的实现,比如交通部门,负责提供交通运输,但是他自己不提供具体的实现。具体服务的实现是其下层,提供者角色。他组要是提供具体的服务,而不对外公布其细节处理。第三个角色就是使用者,即客户端访问。根据客户端的不同需求,调用系统服务,系统服务交给具体的实现商实现。
框架的优势在于为提供商制定统一的接口规范,使其隐藏具体的实现细节。为客户端提供统一的访问接口,并根据需要灵活的切换不同的实现者。

系统服务
系统服务需要兼顾提供者和使用者,并且实现解耦。
对于供应商,系统可以定义好接口规范以供实现【服务提供者接口】:
package com.cs.aine.service;

public interface Provider {
	public Service getService(); 
}

提供接口之后,必须接受供应商的注册,不然供应商无法植入到系统服务中来【提供者注册API】:
package com.cs.aine.service;

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

public class ServiceManager {
	public ServiceManager() {

	}

	private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>();

	/**
	 * @desc for provide to register provider
	 * @param name
	 * @param p
	 */
	public static void registerProvider(String name, Provider p) {
		providers.put(name, p);
	}

对于使用者,系统服务必须定义好统一的访问接口,这定义了系统具体提供了哪些服务【服务接口】:
package com.cs.aine.service;
/**
 * 
 * @author Aine
 *
 */
public interface Service {
	public void goDanYang();//系统提供了去丹阳的功能

	public String getFood();//系统提供了获取食物的功能
}

除此之外,系统服务必须公开访问服务的接口,否则客户端无法获取服务【服务访问API】:
package com.cs.aine.service;

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

public class ServiceManager {
	public ServiceManager() {

	}

	private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>();

	/**
	 * @desc for client to get service
	 * @param name
	 * @return
	 */
	public static Service getService(String name) {

		Provider p = providers.get(name);

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

		return p.getService();
	}
}

提供者/供应商
提供者需要做两个事情:
1 实现系统服务的提供者接口,将自己注册到系统中去。
2 实现系统服务的服务接口,提供自己的实现,并且隐藏在框架之外,不对外公开
package com.cs.aine.provide;

import com.cs.aine.service.Provider;
import com.cs.aine.service.Service;
import com.cs.aine.service.ServiceManager;

public class BusService implements Provider{
	static {  
        ServiceManager.registerProvider("Bus", new BusService());  
    }  
	@Override
	public Service getService() {
		return new SerciceImpl();
	}
	/**
	 * 
	 * @author Aine
	 * @desc needn't internal class
	 */
	class SerciceImpl implements Service{

		@Override
		public void goDanYang() {
			System.out.println("haha, I'm Bus service. I can bring you to DanYang.");
		}

		@Override
		public String getFood() {
			System.out.println("haha, I'm Bus service. I can supply you bus food.");
			return "Bus Food";
		}
		
	}
}

客户端
客户端根据自己的需求,选择不同的服务实现者,比如去丹阳,你自己要选择好做什么交通工具,可以坐汽车,可以做火车,也可以做轮船等等,这都是客户端的事情。
package com.cs.aine.client;

import com.cs.aine.service.Service;
import com.cs.aine.service.ServiceManager;

public class ClientTest {
	public static void main(String [] args){
		try {
			Class.forName("com.cs.aine.provide.TrainService");
			Service service = ServiceManager.getService("Train");  
			service.goDanYang();
			String food = service.getFood();
			System.out.println("I hava food:"+food);
			
			Class.forName("com.cs.aine.provide.BusService");
			service = ServiceManager.getService("Bus");  
			service.goDanYang();
			food = service.getFood();
			System.out.println("I hava food:"+food);
		}  catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}


运行结果
haha, I'm Train service. I can bring you to DanYang.
haha, I'm Train service. I can supply you train food.
I hava food:Train Food
haha, I'm Bus service. I can bring you to DanYang.
haha, I'm Bus service. I can supply you bus food.
I hava food:Bus Food


思考和讨论
1 在客户端必须要知道自己选择的服务提供商的java实现类必须有供应商的驱动包。
  客户端实例化的时候才会驱动注册服务,是否可以将注册服务依附在系统服务中,客户端就可以从服务框架中选择服务商了。
2 如何让框架提供default的实现。
分享到:
评论

相关推荐

    effective enterprise java 中文版

    总的来说,《Effective Enterprise Java》是一本全面而深入的指南,无论你是初学者还是经验丰富的开发者,都能从中获得宝贵的知识和实践经验,提升你在企业级Java开发领域的专业技能。通过阅读并实践书中的建议,你...

    Effective Enterprise Java

    《Effective Enterprise Java》是一本深度探讨企业级Java应用开发的经典著作。这本书主要针对J2EE(Java 2 Platform, Enterprise Edition)平台,旨在提供一系列实用的编程指导和最佳实践,帮助开发者编写出高效、...

    effective enterprise java

    《Effective Enterprise Java》是一本深度探讨企业级Java开发实践的权威教材。这本书旨在帮助开发者提升在企业级Java应用开发中的效率和代码质量,通过一系列经过验证的编程实践和设计原则,提供了一套实用的指导...

    Effective.Enterprise.Java中文版

    Ted Neward作为一名资深的Java专家和顾问,他在书中不仅分享了自己的经验和见解,还提供了实用的建议和技术指导。他的目标是帮助读者理解和解决实际问题,而不是仅仅停留在理论层面上。 **读者受益:** - **非Java...

    Effective.Enterprise.Java.Chinese

    企业级Java平台技术(如J2EE、Java EE、Jakarta EE)提供了丰富的框架和服务,用于解决企业级应用的复杂问题: - **Web服务与消息通信**:了解SOAP、RESTful API、gRPC等Web服务技术,以及JMS、AMQP等消息通信协议...

    自整理Java关于基础和框架的面试题

    ### 自整理Java关于基础和框架的面试题 #### 基础知识点 ##### JDK常用的包 - **java.lang**: 包含所有基本类,如`String`、`Math`等。...- Spring是一个开源框架,提供了一整套的企业级服务解决方案...

    Effective.Enterprise.Java.中文版PDF和TXT下载

    《Effective Enterprise Java》是一本备受推崇的编程指南,专注于提高Java在企业级应用中的效率和质量。这本书由著名软件工程师撰写,旨在帮助开发者理解和掌握Java平台的核心特性,并提供了一套实用的编程准则和...

    Effective.Enterprise.Java.Chinese.eBook.CN

    《Effective Enterprise Java》是一本深度探讨企业级Java开发实践的权威书籍,中文版名为《Effective.Enterprise.Java.Chinese.eBook.CN》。这本书由多位经验丰富的Java开发者共同编写,旨在帮助程序员提高Java在...

    java教材

    市面上有许多优秀的Java教材,如《Java核心技术》、《Effective Java》、《Thinking in Java》等,这些书籍覆盖了从基础语法到高级主题的广泛内容,适合不同水平的学习者。此外,网上还有大量的免费资源,如官方文档...

    javaAPI中文chm大全

    **J2EE指南(J2EE Tutorial)中文版**:这是Oracle官方提供的J2EE教程,它以实例为导向,深入浅出地讲解了J2EE的各项技术,包括Web组件、EJB、JPA(Java Persistence API)、JSF(JavaServer Faces)等,是初学者和...

    Java技术进阶书单

    Spring框架是Java企业级开发中不可或缺的一部分,《Spring技术内幕》深入探讨了Spring框架的核心机制和技术内幕。无论是对于Spring初学者还是资深用户来说,这本书都是非常有价值的参考资料。通过学习本书,Java...

    Java编程培训

    - **标题与描述**:本文档旨在为初学者提供一套完整的Java编程学习路线图,并推荐一系列实用的学习资源,帮助学习者系统地掌握Java编程技能。 #### 二、学习路线 - **核心基础**:首先,需要学习Servlet,这是Java ...

    Java推荐经典书籍

    以下是对“Java推荐经典书籍”这一主题的深度解析,旨在为初学者提供一份详尽的书单指南,帮助他们更高效地掌握Java技能。 ### 1. 《Java核心技术》(Core Java) 《Java核心技术》分为两卷,第一卷主要介绍Java语言...

    Java的概要介绍与分析

    此外,Awesome-java资源列表是一个非常有价值的项目,它整理了大量的开源项目和技术,涉及各个领域,如构建工具、数据库连接、RESTful服务框架、消息队列、缓存系统、日志组件等。 #### 学习资源与社区 Java社区在...

    java推荐书籍

    - **简介**: Hibernate是Java领域中流行的ORM框架之一,本书提供了丰富的案例和实战经验,帮助读者掌握Hibernate的核心技术。 5. **《Struts 2.1权威指南》** - **简介**: Struts 2是Java Web应用开发中常用的...

    java学习之路,java学习书籍

    例如,《Java核心技术卷》、《Head First Java》、《Effective Java》等,都是初学者和进阶者必读的书籍。通过阅读这些书籍,你可以系统地理解Java的基础和高级特性,并逐步提升编程能力。 其次,“java学习之路....

    经典Java书籍+JavaEE整理资料

    总的来说,这个资源包提供的书籍和资料涵盖了从Java基础到JavaEE高级特性的广泛内容,无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。通过系统学习并实践这些知识,你将在Java和JavaEE的世界里更加得心应手...

    java必备知识点大全.pdf

    Java必备知识点大全的内容非常丰富,涵盖了Java语言的基础知识、常用的框架以及数据库的应用等方面,是每一个Java开发者学习和面试时的重要参考。下面是对文档中各个知识点的详细解析。 基础篇: JDK常用的包:Java...

Global site tag (gtag.js) - Google Analytics