`
touchinsert
  • 浏览: 1283413 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

万能调节器(Universal adapter)的设计与实现

阅读更多
万能调节器(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");
//获得关于scmAdapter实例。即com.ibm.issc.universal.SCMAdapter的实例。
UniversalInterface _inter>getUniversalAdapter("scm");
String[] ids={"cvs","vss"};
//执行cvsvssAdaptee里所有在scm-config.xml文件<task>定义的方法,即cvslogincheckout以及vsslogincheckout
_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");
}
//调用Adapterinit方法,初始化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,并在SCMAdapterexecute方法中调用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.xmlVSSAdaptee的配置信息如下:
<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>
该任务将执行logincheckout,然后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 这个是万能BIOS刷写工具Universal Flash Utility,版本号是V8.93。 现在很多主板都是用Award的BIOS,因此大家在进行BIOS的升级时所用的刷写工具是Awdflash.exe。但...

    universal viewer pro 6.7- 万能文件查看器 6.7

    universal viewer pro 6.7- 万能文件查看器 6.7 太强大了,各种视频,各种文件(可能也有个别罕见的不支持吧); universal viewer pro - 万能文件查看器, 这个是目前发现的版本最新,且功能最强大的了; 对于99%...

    极品文件万能提取工具Universal_Extractor1.61中文绿色版(5.83M)

    极品万能文件提取器(解包工具)Universal Extractor1.6.1中文绿色版 xzpd2012评语:这款软件只能用牛来形容,效果一试便知~~ 推荐~~ 以下是介绍: 将近2年之后, 终于再次更新。这个版本主要是错误修复、可靠性改进...

    Universal_Extractor 1.7.9.95 ( 万能解包工具 / 微软官方 )

    万能解包工具 / 微软官方 Universal Extractor是一款近乎于万能的文件提取器,支持的文件类型多达40多种。无论是简单的压缩文件如zip、rar、7z 还是软件的安装程序如Inno Setup、InstallShield、Winodws Installer,...

    Universal Extractor 1.6 万能解包工具

    Universal Extractor,是一个“万能解包工具”。它能解开现在流行打包工具比如:NSIS,Inno 等等!无论是简单的 Zip 文件,还是一个安装程序,甚至连 Windows Installer (.msi) 程序包,它也能轻松自如地提取出其中的...

    Universal Extractor 万能的文件提取器 汉化版

    Universal Extractor 是一款近乎于万能的文件提取器,支持的文件类型多达40多种。无论是简单的压缩文件如zip、rar、7z,还是软件的安装程序如Inno Setup、InstallShield、Winodws Installer,抑或是一些软盘光盘镜像...

    Universal-Adapter:万能的Adapter

    万能的Adapter, 代码回去添加 普通的适配器 public class OldMyAdapter extends BaseAdapter { Context context; List&lt; UserEntity&gt; userEntities; LayoutInflater inflater; public OldMyAdapter ( Context ...

    万能文件查看器(Universal Viewer Pro)

    万能文件查看器,支持数百种格式,无需安装,操作简单,电脑中常见的文件类型都可以查看。 平时在用电脑查看文件时,总是要依次打开能查看该文件格式的软件,有时遇到一些打不开的文件,还需另外下载一个与之匹配的...

    yaokong.zip_universal remote_万能_万能遥控器_成熟 代码_遥控技术

    万能遥控器原代码!技术非常成熟,很实用!

    Universal Extractor 1.6.1 万能解包工具 绿色版

    Universal Extractor 1.6.1 是近乎于万能的文件提取器.可以用来unpack n多的exe安装包格式,特别用来分离安装包中的流氓软件特别有效。 此绿色版为官方发布,只要解压就可以使用。 支持简体中文语言,只要在设置中选...

    万能文档阅读器(Universal Viewer)v6.5官方中文版.rar

    Universal Viewer是一款万能的文件阅读器,支持200多种文件格式,可以浏览查看图片文件,也可以播放多媒体的音频及视频文件,可以打开INTEL网页文件,也能够打开OFFICE/PDF文件等。打开WORD/PDF/EXCEL文件时,不...

    Universal Extractor

    Universal Extractor是一款近乎于万能的文件提取器,支持的文件类型多达40多种。无论是简单的压缩文件如zip、rar、7z,还是软件的安装程序如Inno Setup、InstallShield、Winodws Installer,抑或是一些软盘光盘镜像...

    Universal Extractor 1.9.18.204 万能解压提取工具

    Universal Extractor是一款万能的压缩包、安装包、可执行文件的解压提取工具,新版得到了重新维护、更新,内部支持TRID扫描、PEiD扫描,以及几十款解压工具测试。

    Universal Extractor(解包提取工具) v2.0.0 RC4一款近乎于万能的文件提取器.exe

    Universal Extractor是一款近乎于万能的文件提取器,支持的文件类型多达40多种。无论是简单的压缩文件如zip、rar、7z,还是软件的安装程序如Inno Setup、InstallShield、Winodws Installer,抑或是一些软盘光盘镜像如...

    Universal Extractor 万能exe解包工具

    正如其名,Universal Extractor 是一个可以从任何类型的存档文件中提取文件的程序,无论是简单的ZIP 文件、安装程序(如 Wise 或 NSIS),还是 Windows 安装程序 (.msi) 包。 该应用程序并不打算成为一个一般用途的...

    universal hashing.pdf

    1998年的英文资料,共12页,非常详细地介绍了universal hashing。universal hashing(在随机算法或数据结构中)是指从具有一定数学属性的哈希函数族中随机选择哈希函数。 即使数据是由对手选择的,这也保证了预期的...

    Universal Extractor V1.6 RC1 绿色汉化版

    Universal Extractor,就是“万能的提取器”。它几乎可以提取任何种类的档案文件,无论是简单的 Zip 文件,还是一个安装程序,甚至连 Windows Installer (.msi) 程序包,它也能轻松自如地提取出其中的文件。 可以...

    TAUniversalAnalysis操作手册

    TAUniversalAnalysis操作手册

Global site tag (gtag.js) - Google Analytics