完成一个差不多相当于适配器的功能!!!!

浪漫小和 2013-11-20 01:45:38
目前要完成一个工作流平台支持参数映射的功能,功能大体如下
2个系统 A 和 B ,我们的系统就相当于处于 A B 之间的,
比如A系统传递参数过来,我们系统接受到之后再传递给 B
但是现在问题是假设A传递来的参数是 a1=xx a2=xx 但是 B 需要接受的参数
是 b1=xx b2=xx所以我们这个适配器就要将 参数名a1 转化成名字b1,但是目前具体参数个数
和参数名都还未确定,要我写一个这个功能,如何写呢?
...全文
344 24 打赏 收藏 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
浪漫小和 2013-11-21
  • 打赏
  • 举报
回复
String classPath = SystemConfigUtil.getInstance().getProps().getProperty("convertorClass"); ConvertorImpl convertorImpl = (ConvertorImpl) Class.forName(classPath).newInstance(); 这个写法如何获取具体在那个包下面?
浪漫小和 2013-11-21
  • 打赏
  • 举报
回复
大牛的思路是我这个小牛难以理解滴。。
suciver 2013-11-21
  • 打赏
  • 举报
回复
引用 19 楼 wdcqrs 的回复:
properties.getProperty("convertorClass"); 这个 properties 和 convertorClass 指?
properties当然是指load进来的properties我代码只是描述出思路,convertorClass当然是指你转换器的实现类。
Amarantine_LT 2013-11-21
  • 打赏
  • 举报
回复
Hi, 参数转换模块,我想可能要考虑参数的个数,顺序,类型,并且可能不同的命令转换的方式不同。 如果特别简单,我想可以考虑简单的字符窜替换。 1.设置规则文件。 command1: a1,a2,a3=b1,b2,b3 command2: a1,a2 = b1,b2 2.读入数据,直接replace完成。 3.传入右侧。 按照这样的模块编写,等实际业务规则来了,只要完成规则文件就好了。 顺便说一下,你可以直接定义规则在类中String command1=“command1: a1,a2,a3=b1,b2,b3”; 效果和properties一样。
coooliang 2013-11-20
  • 打赏
  • 举报
回复
适配器不是设计模式么?
浪漫小和 2013-11-20
  • 打赏
  • 举报
回复
properties.getProperty("convertorClass"); 这个 properties 和 convertorClass 指?
suciver 2013-11-20
  • 打赏
  • 举报
回复
引用 17 楼 wdcqrs 的回复:
不是很明白 ConvertorFactory 的作用!
ConvertorFactory是负责产生Convertor的实例的因为你Convertor是一个接口而且Convertor的实现类是不定的我们为了提高维护和拓展性让其实现类可以在properties文件中设置实现类的类路径 如果不用这个你怎么能new出Convertor的实现类。有了这个工厂你在使用转换器的时候就可以直接 ConvertorFactory.newInstance().convert(mapA,mapB);在代码上不用再改动了要改动的只是配置文件上的参数对照和如果Convertor实现类不好那就在弄个实现类在properties中的实现类路径替换掉这样硬编码都不用改动。这种模式被想Log4j这样的jar广泛的应用
浪漫小和 2013-11-20
  • 打赏
  • 举报
回复
不是很明白 ConvertorFactory 的作用!
小丑哥_V5 2013-11-20
  • 打赏
  • 举报
回复
引用 14 楼 suciver 的回复:
楼主这个需求不像适配器更像是转换器,典型的适配器是像slf4j-api和log4j以及jdk中的Reader与inputStream这样的。他们都是实现目标接口持有原接口,楼主这种的并不是这样的,更倾向于转换器。可以定义一个统一的Convertor接口,接口中的convert方法由实现类去做。实现类以及要转换的参数对照都可以由properties文件中读取。ConvertorFactory去newInstance这里面就是读取properties中设置的convertor实现。

public interface Convertor{
  public Map<String,Object> convert(Map<String,Object> mapA,Map<String,Object> mapB);//如果是参数的话这里就是确定的map
}
public class ConvertorImpl implements Convertor{
  private Map<String,String> convertParams;
  public ConvertorImpl(){
    //读取properties中要转换的信息,存到convertParams,如果无需转换的可以存原参数名
  }
  public Map<String,Object> convert(Map<String,Object> mapA,Map<String,Object> mapB){
    
    for(Map.Entry<String,Object> entry:mapA.entrySet()){
     //这里直接把A系统的参数都填入B系统中,需要转换的自然就转换了
      mapB.put(convertParams.get(entry.getKey()),entry.getValue());
    }
  }
}
  //一个工厂类负责从properties中获得Convertor的实现实例
  public class ConvertorFactory{
    public static Convertor newInstance(){
      //读取properties中设置的转换器实现类以后如果用不同的实现就可以在properties中设置无需改动代码了
      String classPath=properties.getProperty("convertorClass");
      Class.forName(classPath).newInstance();
    }
  }
//properties文件可以这样写
//有多少个就填多少个
a1=b1
a2=b2
//用于设置接口实现类以后可以更换
convertorClass=ConvertorImpl
比较靠谱
浪漫小和 2013-11-20
  • 打赏
  • 举报
回复
都是牛人。。
suciver 2013-11-20
  • 打赏
  • 举报
回复
楼主这个需求不像适配器更像是转换器,典型的适配器是像slf4j-api和log4j以及jdk中的Reader与inputStream这样的。他们都是实现目标接口持有原接口,楼主这种的并不是这样的,更倾向于转换器。可以定义一个统一的Convertor接口,接口中的convert方法由实现类去做。实现类以及要转换的参数对照都可以由properties文件中读取。ConvertorFactory去newInstance这里面就是读取properties中设置的convertor实现。

public interface Convertor{
  public Map<String,Object> convert(Map<String,Object> mapA,Map<String,Object> mapB);//如果是参数的话这里就是确定的map
}
public class ConvertorImpl implements Convertor{
  private Map<String,String> convertParams;
  public ConvertorImpl(){
    //读取properties中要转换的信息,存到convertParams,如果无需转换的可以存原参数名
  }
  public Map<String,Object> convert(Map<String,Object> mapA,Map<String,Object> mapB){
    
    for(Map.Entry<String,Object> entry:mapA.entrySet()){
     //这里直接把A系统的参数都填入B系统中,需要转换的自然就转换了
      mapB.put(convertParams.get(entry.getKey()),entry.getValue());
    }
  }
}
  //一个工厂类负责从properties中获得Convertor的实现实例
  public class ConvertorFactory{
    public static Convertor newInstance(){
      //读取properties中设置的转换器实现类以后如果用不同的实现就可以在properties中设置无需改动代码了
      String classPath=properties.getProperty("convertorClass");
      Class.forName(classPath).newInstance();
    }
  }
//properties文件可以这样写
//有多少个就填多少个
a1=b1
a2=b2
//用于设置接口实现类以后可以更换
convertorClass=ConvertorImpl
浪漫小和 2013-11-20
  • 打赏
  • 举报
回复
这个map里放什么?
快乐的2 2013-11-20
  • 打赏
  • 举报
回复
功能可以先写出来。等出来参数数量及转换关系后再修改下配置文件就行了。
快乐的2 2013-11-20
  • 打赏
  • 举报
回复
1、建立属性映射配置文件用properties文件即可。文件格式可以如下: #左侧是A的属性名称,右侧是B的属性名称,未在配置文件中出现的不做转换 a1=b1 a2=b2 region=area 2、加载配置文件进内存,并映射为Map<String,String> 3、获取A方属性列表,通过配置映射Map判断是否需要进行名称转换。 4、将转换后的属性列表作为B系统的参数请求B系统。
浪漫小和 2013-11-20
  • 打赏
  • 举报
回复
不明白啊。。。
浪漫小和 2013-11-20
  • 打赏
  • 举报
回复
楼上的朋友可以加你详谈不。
etfired 2013-11-20
  • 打赏
  • 举报
回复
引用 7 楼 wdcqrs 的回复:
还不知道映射配置文件
为明确的部分就是解析配置文件,可以用接口现将设计模式实现, 怎么读取配置文件通过传入不同的接口实现来完成,测试的时候你用一个随便的配置代替即可
浪漫小和 2013-11-20
  • 打赏
  • 举报
回复
还不知道映射配置文件
etfired 2013-11-20
  • 打赏
  • 举报
回复
你的需求是典型的适配器模式,业务比较简单,需要重复定义多个是配置,一类功能定义一个比较合适 我理解的思路是这样: 读入映射配置文件(可以是XML,也可以是数据库) 配置文件记载转换field赋值转换规则 new 目标对象,反射赋值,返回

public <T, E> T convert(E e, Class<T> t) {
  T to = t.newInstance();
  ReadXML<T,E> xml = new ReadXML<T, E>(e.getClass(), t);
  return xml.toBean(e);
}
E为传入的对象,T是要返回的对象
sffx123 2013-11-20
  • 打赏
  • 举报
回复
随便整个集合作为参数传递呗
加载更多回复(4)
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 用户账户控制(UAC)白名单的配置 Windows7环境中 UAC(User Account Control,用户帐户控制)是由微软在Windows Vista版本中推出的一项旨在增强系统安全性的创新技术,该技术强制要求用户在执行可能干扰计算机正常运作的操作或进行更改会波及其他用户设置的变动前,必须提供相应的权限或管理员密码进行验证。通过对这些操作启动前进行授权确认,UAC能够有效阻止恶意软件及间谍软件在未获授权的状态下于计算机内进行安装或实施修改。 自从Vista版本问世以来,微软便开始推行这一全新的安全机制,可视为对系统安全防护的显著提升。尽管UAC确实能够在一定程度上对某些非法程序起到防御作用,但与此同时,这一功能也给众多用户带来了诸多不便。 因此,许多用户开始探寻是否存在类似于白名单的功能,以便将那些值得信赖的程序直接赋予运行权限。事实上,这类功能确实存在,不过微软并未将其作为标准配置提供。 网络上关于此问题的绝大多数建议都是建议禁用UAC,这种说法显然缺乏针对性,因为若用户希望禁用此功能,本就不会提出相关疑问。 通过运用微软官方发布的Microsoft Application Compatibility Toolkit 5.6版本,可以将信任的程序纳入系统白名单范畴。 获取Application Compatibility Toolkit 安装程序成功后会出现三个可执行文件 以管理员身份启动Compatibility Administrator 在Custom DataBases部分创建新的数据库,并添加一个Application Fix(在下方空白处点击右键,选择...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 DELL服务器的操作系统部署流程包含一系列细致的环节,其适用范围涵盖多种操作系统类型,例如Windows Server与Red Hat Linux等。在启动部署之前,必须确认服务器的光驱设备为DVD驱动器,并且需准备对应的系统安装媒介。下面将详细列出完整的部署步骤: 1. **启动准备**:将随服务器提供的Systems Management Tools and Documentation version 6.0光盘置入服务器光驱,随后设定服务器以光驱作为启动设备。此环节旨在确保服务器在启动阶段能够读取安装光盘内容。 2. **语言设定**:服务器启动后,选定简体中文作为部署语言,并确认接受许可协议条款。 3. **时区选择**:在部署期间,需设定时区为北京、香港、重庆或乌鲁木齐,依据实际地理位置进行适配选择。 4. **系统类型选择**:随后,需选定计划部署的操作系统,支持的版本包括Server 2003 SP2、Server 2003 SP2 64位版本、Windows 2003 SBS SP2、Server 2008、Windows 2008 SBS/EBS x64版本等,以及多种Red Hat和SUSE Linux版本。 5. **RAID设定**:若服务器出厂时已预设RAID配置,则可选择跳过此步骤。若需重新设定RAID,操作时需格外小心,因为这一过程可能引发硬盘数据遗失。 6. **引导分区规划**:设定引导分区的大小,通常C盘建议预留至少20GB的空间,具体容量需根据系统需求进行调整。 7. **网络设定**:网络设定可在系统部署完成后执行,部署期间建议暂时拔除...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧