万能调节器(Universal adapter)的设计与实现
-Factory, Singleton, Adapter和Reflection的应用
本文的目的是设计并实现一个工厂(Factory),可以通过配置文件adapter-config.xml,生成配置文件内定义的Adapter的实例,每个Adapter又可以灵活的调用任何一个类的多个方法。
1.设计
UML类图如下:
UniversalFactory类负责创建Adapter实例,它是一个Singleton类,调用CreateInstance静态方法实例化该工厂类,并根据adapter-config.xml的内容初始化Adapters,然后调用getUniversalAdapter方法获得某个Adapter实例。
Adapter-config.xml文件内容如下:
<adapters>
<adapter name="scm" class="com.ibm.issc.universal.SCMAdapter">
<config file="E:/MyProject/UniversalAdapters/UniversalAdapters/config/scm-config.xml"/>
</adapter>
<adapter name="office" class="com.ibm.issc.universal.OfficeAdapter">
<config file="E:/MyProject/UniversalAdapters/UniversalAdapters/config/office-config.xml"/>
</adapter>
</adapters>
每个Adapter必须继承UniversalAdapter抽象类,该抽象类又实现UniversalInterface接口,UniversalInterface接口有唯一的一个方法execute供用户调用。每个Adapter还必须实现UniversalAdapter的一个init抽象方法,该方法负责读入adapter的config文件,例如scm-config.xml和office-config.xml文件,并根据config文件实例化Adaptee类,adaptee可以是任意类。例如图中的VSSAdaptee,WordAdaptee。
Adapter的config文件如下:
<scms>
<scm name="vss" class="com.ibm.issc.adaptee.VSSAdaptee" stateful="false">
<tasks>
<task id="login" method="login">
<param name="userid" value="zhaolei"/>
<param name="pass" value="zaq12wsx"/>
<param name="root" value="//9.186.27.239/vss"/>
</task>
<task id="checkout" method="checkout">
<param name="project" value="input"/>
<param name="target" value="c:/inputsrc"/>
</task>
</tasks>
</scm>
<scm name="cvs" class="com.ibm.issc.adaptee.CVSAdaptee" stateful="true">
<tasks>
<task id="login" method="login">
<param name="userid" value="zhaolei"/>
<param name="pass" value="zaq12wsx"/>
<param name="root" value="//9.186.27.239"/>
<param name="path" value="c:/cvspath"/>
</task>
<task id="checkout" method="checkout">
<param name="project" value="input"/>
<param name="target" value="c:/inputsrc"/>
</task>
</tasks>
</scm>
</scms>
当用户调用Adapter的execute方法时,需要传入需要想要调用的Adaptee的id,该id保存在config文件中的<task>里。
一个使用该工具的例子:
//工厂的实例化
UniversalFactory.CreateInstance(
"E:/MyProject/UniversalAdapters/UniversalAdapters/config/adapter-config.xml");
//获得关于scm的Adapter实例。即com.ibm.issc.universal.SCMAdapter的实例。
UniversalInterface _inter>getUniversalAdapter("scm");
String[] ids={"cvs","vss"};
//执行cvs和vss的Adaptee里所有在scm-config.xml文件<task>定义的方法,即cvs的login和checkout,以及vss的login和checkout
_interface.execute(ids);
2.实现
文本采用了工厂模式,单体模式,调节器模式和Java的反射机制。
2.1 工厂类的实现-工厂模式和单体模式
UniversalFactory类内保存所有Adapter的实例,它是一个单体模式和工厂模式类。
/**
* Universal Factory that creates instances of adapters.
* @author tyrone
*
*/
public class UniversalFactory {
//保存所有Adapter
private static HashMap adapters=new HashMap(10);
//工厂实例
private static UniversalFactory factory;
//单体模式
private UniversalFactory(){
}
/**
* Create instance of itself.
* initialize adapters that are saved in factory.
* @param configxml
* @throws UniversalFactoryException
*/
public static void CreateInstance(String configxml)
throws UniversalFactoryException{
if(factory==null){
factory=new UniversalFactory();
}
//解析adapter-config.xml文件。XMLAdapterProcess的实现略。
XMLAdapterProcess process;
try {
process = new XMLAdapterProcess(configxml);
} catch (XMLException e) {
throw new UniversalFactoryException(e);
}
List infos=process.getInfos();
int size=infos.size();
if(size==0)
{
throw new UniversalFactoryException("No adapters");
}
int i;
for(i=0;i<size;i++){
Object o=infos.get(i);
if(!(o instanceof XMLAdapterInfo)){
throw new UniversalFactoryException("Adapter info error");
}
XMLAdapterInfo adapterInfo=(XMLAdapterInfo)o;
try {
//实例化Adapter。
UniversalAdapter adapter=(UniversalAdapter)Class.forName(adapterInfo.getClassName()).newInstance();
if(adapter==null){
throw new UniversalFactoryException("adapter instantiate error");
}
//调用Adapter的init方法,初始化Adapter。
adapter.init(adapterInfo.getClassName(), adapterInfo.getConfig());
//将Adapter实例保存到HashMap。
adapters.put(adapterInfo.getName(),adapter);
} catch(UniversalAdapterException e){
throw new UniversalFactoryException(e);
} catch (InstantiationException e) {
throw new UniversalFactoryException(e);
} catch (IllegalAccessException e) {
throw new UniversalFactoryException(e);
} catch (ClassNotFoundException e) {
throw new UniversalFactoryException(e);
}
}
}
/**
* get specified adapter
* @param name
* @return
* @throws UniversalFactoryException
*/
public static UniversalInterface
getUniversalAdapter(String name)
throws UniversalFactoryException{
//从HashMap中获得Adapater实例。
Object adapter=adapters.get(name);
if (adapter ==null){
return null;
}else if(!(adapter instanceof UniversalInterface))
{
throw new UniversalFactoryException("Adapter:"+
name + " is not compatible");
}
return (UniversalInterface)adapter;
}
}
2.2 调节器类的实现-Adapter模式和反射机制
SCMAdapter负责实例化scm-config.xml文件中定义的class,并在SCMAdapter的execute方法中调用scm-config.xml文件中定义的各个<task>中的method。使用Java反射机制动态调用method。
public class SCMAdapter extends UniversalAdapter {
//解析scm-config.xml。实例化adaptee。
public void init(String id, String config) throws UniversalAdapterException {
this.id=id;
this.setSession(new SCMSession());
try {
XMLSCMProcess process=new XMLSCMProcess(config);
List infos=process.getInfos();
int size=infos.size();
if(size==0)
throw new UniversalAdapterException("no adaptee");
int i;
for(i=0;i<size;i++){
Object o=infos.get(i);
if(!(o instanceof SCMInfo))
throw new UniversalAdapterException("adaptee info error");
SCMInfo scmInfo=(SCMInfo)o;
try {
//实例化Adaptee。
Object adaptee=Class.forName(scmInfo.getClassName()).newInstance();
//保存到Session。
this.getSession().setAdaptee(scmInfo.getName(), adaptee);
//保存task。
this.getSession().setTask(scmInfo.getName(), scmInfo.getTasks());
} catch (InstantiationException e) {
throw new UniversalAdapterException(e);
} catch (IllegalAccessException e) {
throw new UniversalAdapterException(e);
} catch (ClassNotFoundException e) {
throw new UniversalAdapterException(e);
}
}
} catch (XMLException e) {
throw new UniversalAdapterException(e);
}
}
public SCMAdapter(){
//read configXml
String config=this.getCongigXml();
//init scm adaptees.
}
/*执行tasks
*/
public Object[] execute(String[] id) throws UniversalAdapterException {
int size=id.length;
int i;
List result=new ArrayList();
for(i=0;i<size;i++){
//从Session中获得Adaptee
Object adaptee=this.getSession().getAdaptee(id[i]);
//获得tasks
TaskInfo[] tasks=this.getSession().getTasks(id[i]);
int l;
//执行tasks
for(l=0;l<tasks.length;l++){
System.out.println("Adaptee:"+id[i]+" execute:"+tasks[l].getId());
//获得method所需所有参数。
Object[] args=tasks[l].getParams();
int psize=args.length;
Class[] paramsType=new Class[psize];
int k;
//参数类型都为string
for(k=0;k<psize;k++){
paramsType[k]=String.class;
}
try {
//java反射,获得method对象。
Method method=adaptee.getClass().getMethod(tasks[l].getMethod(),paramsType);
//invoke方法。将结果返回Result。
result.add(method.invoke(adaptee,args));
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
throw new UniversalAdapterException(e);
} catch (NoSuchMethodException e) {
throw new UniversalAdapterException(e);
}
}
}
return result.toArray();
}
}
3.结果
定义一个Adaptee,名为VSSAdaptee
/**
*statelessadaptee
*@authortyrone
*
*/
publicclass VSSAdaptee{
public VSSAdaptee(){
}
//登录
publicvoid login(String userid,String pass,String database) throws VSSException{
System.out.println(this.getClass().getName()+"login:"+userid+","
+pass+","+database);
}
//checkout
publicvoid checkout(String project,String target){
System.out.println(this.getClass().getName()+"checkout:"+project+","
+target);
}
//推出
publicvoid logout(){
System.out.println(this.getClass().getName()+"logout:");
}
}
Scm-config.xml中VSSAdaptee的配置信息如下:
<scm name="vss" class="com.ibm.issc.adaptee.VSSAdaptee" stateful="false">
<tasks>
<task id="login" method="login">
<param name="userid" value="tyrone"/>
<param name="pass" value="zx"/>
<param name="root" value="//19.186.27.239/vss"/>
</task>
<task id="checkout" method="checkout">
<param name="project" value="input"/>
<param name="target" value="c:/inputsrc"/>
</task>
</tasks>
</scm>
该任务将执行login,checkout,然后logout。
运行测试程序:
publicclass UniversalFactoryTest {
/**
*@paramargs
*/
publicstaticvoid main(String[] args) {
try {
UniversalFactory.CreateInstance(
"D:/MyProject/colimas/universal/UniversalAdapters/config/adapter-config.xml");
UniversalInterface _inter>getUniversalAdapter("scm");
String[] ids={"vss"};
_interface.execute(ids);
} catch (UniversalAdapterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UniversalFactoryException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果如下:
Adaptee:vss execute:login
com.ibm.issc.adaptee.VSSAdapteelogin:tyrone,zx,//19.186.27.239/vss
Adaptee:vss execute:checkout
com.ibm.issc.adaptee.VSSAdapteecheckout:input,c:/inputsrc
Adaptee:vss execute:logout
com.ibm.issc.adaptee.VSSAdapteelogout:
分享到:
相关推荐
万能BIOS刷新工具Universal Flash Utility V8.93 这个是万能BIOS刷写工具Universal Flash Utility,版本号是V8.93。 现在很多主板都是用Award的BIOS,因此大家在进行BIOS的升级时所用的刷写工具是Awdflash.exe。但...
universal viewer pro 6.7- 万能文件查看器 6.7 太强大了,各种视频,各种文件(可能也有个别罕见的不支持吧); universal viewer pro - 万能文件查看器, 这个是目前发现的版本最新,且功能最强大的了; 对于99%...
总结,万能遥控器的技术原理在于红外信号的编码与解码,实现的关键在于有效的软件和硬件设计。通过学习和理解提供的代码,开发者可以进一步优化和定制万能遥控器的功能,使其更好地适应不断变化的智能设备环境。
极品万能文件提取器(解包工具)Universal Extractor1.6.1中文绿色版 xzpd2012评语:这款软件只能用牛来形容,效果一试便知~~ 推荐~~ 以下是介绍: 将近2年之后, 终于再次更新。这个版本主要是错误修复、可靠性改进...
"Blend"在这里可能是指Microsoft Blend,这是一个与Visual Studio配套使用的工具,用于创建丰富的Windows Presentation Foundation (WPF)和Universal Windows Platform (UWP)应用程序的可视化设计。Blend提供了更...
万能解包工具 / 微软官方 Universal Extractor是一款近乎于万能的文件提取器,支持的文件类型多达40多种。无论是简单的压缩文件如zip、rar、7z 还是软件的安装程序如Inno Setup、InstallShield、Winodws Installer,...
Universal Extractor 是一款近乎于万能的文件提取器,支持的文件类型多达40多种。无论是简单的压缩文件如zip、rar、7z,还是软件的安装程序如Inno Setup、InstallShield、Winodws Installer,抑或是一些软盘光盘镜像...
万能的Adapter, 代码回去添加 普通的适配器 public class OldMyAdapter extends BaseAdapter { Context context; List< UserEntity> userEntities; LayoutInflater inflater; public OldMyAdapter ( Context ...
万能文件查看器,支持数百种格式,无需安装,操作简单,电脑中常见的文件类型都可以查看。 平时在用电脑查看文件时,总是要依次打开能查看该文件格式的软件,有时遇到一些打不开的文件,还需另外下载一个与之匹配的...
基于FPGA和FIFO技术的多串口系统设计与实现 本文介绍了一种基于FPGA和FIFO技术的多串口系统的设计与实现。该系统可以同时与多个外设进行串口通信,并提高通信效率。系统由接口模块、寄存器读写模块、2路内置16字节...
Universal Extractor,是一个“万能解包工具”。它能解开现在流行打包工具比如:NSIS,Inno 等等!无论是简单的 Zip 文件,还是一个安装程序,甚至连 Windows Installer (.msi) 程序包,它也能轻松自如地提取出其中的...
3. **万能适配器(Universal Adapter)** - 这种适配器通常是一个泛型类,能够接受多种数据类型,通过反射机制动态解析数据并设置到对应的视图上,减少了为不同数据类型创建多个适配器的需求。 - 提供了模板方法,...
### 基于USB接口的数据采集模块设计与实现的关键知识点 #### 1. USB总线标准与发展 USB(Universal Serial Bus)总线是为统一PC机的外设接口而设计的新一代接口总线,旨在简化计算机与外部设备的连接。自1996年...
Universal Extractor 1.6.1 是近乎于万能的文件提取器.可以用来unpack n多的exe安装包格式,特别用来分离安装包中的流氓软件特别有效。 此绿色版为官方发布,只要解压就可以使用。 支持简体中文语言,只要在设置中选...
基于USRP的GPS基带信号源设计与实现 一、概述 GPS(Global Positioning System)是目前全球最为广泛使用的卫星导航系统,它能够为用户提供准确的位置、速度和时间信息。然而,GPS信号源的设计和实现对用户来说是一...
Universal Viewer是一款万能的文件阅读器,支持200多种文件格式,可以浏览查看图片文件,也可以播放多媒体的音频及视频文件,可以打开INTEL网页文件,也能够打开OFFICE/PDF文件等。打开WORD/PDF/EXCEL文件时,不...
UART 的设计与实现可以分为三个模块:发送器设计、接收器设计和波特率发生器设计。发送器设计中,UART 串行发送器模块框图包括 THR(发送保持寄存器)和 TSR(发送移位寄存器)。复位时,引脚 TRE 为高电平。当数据...
【Universal Extractor 1.9.18.204 万能解压提取工具】是针对各种压缩包、安装包及可执行文件设计的一款强大工具。它具有广泛的兼容性,能够处理市面上大部分的压缩格式,如ZIP、RAR、7Z、TAR等,同时也能够对各种...
为了提高代码的复用性和可维护性,开发者通常会创建一个"万能适配器"(Universal Adapter),来适应各种不同类型的ListView需求。这个适配器的设计目标是简化数据绑定和视图更新的过程,使得在处理多种数据源时,只...