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

浪漫小和 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,但是目前具体参数个数
和参数名都还未确定,要我写一个这个功能,如何写呢?
...全文
341 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)

62,621

社区成员

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

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