传送带图案?

时间:2014-07-18 12:32:28

标签: java oop xslt design-patterns jaxb

我目前正在开发的项目是一个Web应用程序(主要是Web服务,而不是JSP或类似的东西),它作为来自前端的旧界面(它暴露了一对夫妇的网页)之间的“façade”。 Web服务to)和底部更复杂的界面(使用Web服务来调用它们)。

底部的许多Web服务都有相当复杂的结构(标准的一部分,我无法改变)。

在这种情况下我喜欢做的是创建简单的JAXB POJO并使用XSLT将它们转换为复杂的结构。

例如:

@XmlRootElement(name = "simplequery", namespace="http://www.foo.com")
@XmlAccessorType(XmlAccessType.FIELD)
public class SimpleQuery {

    @XmlElement(name = "id")
    private String name;

    public void setId(String id) {
        this.id = id;
    }
}

我可以这样称呼它:

SimpleQuery sq = new SimpleQuery();
sq.setId("12264736376374");
org.w3c.dom.Document sqDoc = new XsltTransformer("SimpleQuery-to-VeryComplexQuery.xsl").transform();
QueryConsumer.sendQuery(sqDoc);

你只需假设这些课程存在并按照你的想法去做。

以下是我的示例XSLT的相关摘录:

<template match="foo:simplequery">
    <some><complex><structure><id><x:value-of select="foo:id"/></id></structure></complex></some>
</template>

我喜欢这样做有两个原因:

  1. “配置”在XSLT中完成,而不是在编译代码中完成,因此我可以轻松维护它
  2. 我不需要用复杂的JAXB对象创建可怕的(我喜欢称之为)“金字塔代码”:

    Some s = new Some(); s.setComplex(new Complex()); s.getComplex().setStructure(new Structure()); s.getComplex().getStructure().setId(new Id()); s.getComplex().getStructure().getId().setValue("1222333232");

  3. 时间到了这一点。有几个复杂的接口指向不同的Web服务甚至是服务器,它们都在各自的命名空间中。

    在一些重构OCD期间,我想放置这部分:

    SimpleQuery sq = new SimpleQuery();
    sq.setId("12264736376374");
    org.w3c.dom.Document sqDoc = new XsltTransformer("SimpleQuery-to-VeryComplexQuery.xsl").transform();
    

    ...使用静态方法进入特定的静态类。

    现在面临挑战:为该课程找一个好名字!

    该类的作用非常简单:它采用简化对象并将其转换为复杂对象。因此,我的Conveyor Belt模式。在这种情况下,它只是吐出DOM文档,但它也可能创建JAXB对象,这些对象是该文档的JAXB版本(我的XsltTransformer已经可以这样做了)。

    我尝试过像ComplexQueryFactory这样的名字,但它似乎不对。

0 个答案:

没有答案