Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设计模式/数据加载解决方案_Java_Design Patterns - Fatal编程技术网

Java 设计模式/数据加载解决方案

Java 设计模式/数据加载解决方案,java,design-patterns,Java,Design Patterns,我一直在从事一些涉及加载数据的项目,有时是远程加载,有时是本地加载,有时是JSON加载,有时是XML加载。我遇到的问题是,由于发展的速度和不同客户的想法不断变化,我发现我的设计过于僵化,我希望它们更加灵活。我一直在试图想出一个可重用的数据加载解决方案,并希望得到一些建议,因为我想你们中的许多人都有同样的问题 我想做的是创建一个泛型的LoadingOperation抽象类,它具有类型为Parser和Loader的成员变量,分别具有parse()和loadData()方法。解析器和加载器类是实现这些

我一直在从事一些涉及加载数据的项目,有时是远程加载,有时是本地加载,有时是JSON加载,有时是XML加载。我遇到的问题是,由于发展的速度和不同客户的想法不断变化,我发现我的设计过于僵化,我希望它们更加灵活。我一直在试图想出一个可重用的数据加载解决方案,并希望得到一些建议,因为我想你们中的许多人都有同样的问题

我想做的是创建一个泛型的LoadingOperation抽象类,它具有类型为ParserLoader的成员变量,分别具有parse()和loadData()方法。解析器加载器类是实现这些的接口和类,可以是XMLParser和JSONParser、LocalLoader和RemoteLoader等。有了这样的东西,我希望有一个新类,它扩展了LoadingOperation以加载每件东西,不管这是本地XML文件,或者远程JSON,或者别的什么

问题是特定的解析器实现无法返回自定义数据类型,而不破坏LoadingOperation类的多态行为。我一直在乱搞泛型和声明加载操作的子类

class SpecificLoader extends LoadingOperation<CustomDataType>
class SpecificLoader扩展了LoadingOperation
使用解析器类执行类似的操作,但这似乎有点奇怪

有人对我做错了什么/可以做得更好有什么建议吗。我希望能够对不断变化的规范做出快速反应(忽略它们不应该变化太多的事实!),并对代码进行逻辑分离等等

谢谢你的帮助


编辑:这里也有问题

在我看来,你们真的想要一种用尽可能少的代码轻轻键入的东西,因为需求变化太快了。下面是我如何做我的一个项目,我使用PHP作为后端。我使用sql和json快速从数据库中获取数据并返回到客户机

通常我在数据库中进行选择,对于每个结果行,我将该行转换为一个映射,其中每个列都成为键,值作为该列的结果。然后,通过一个通用的json rutine将此映射列表转换为json,并从服务器发送json

这样的设置非常容易将一些数据从服务器传输到客户端,但是:

  • 您失去了使用hibernate/xml/remoting可以获得的类型安全性
  • 客户机与数据库模式紧密耦合
  • 虽然抓取和传输数据非常快
  • 如果更改查询以获取更多数据,则不需要重新编译客户端,除非它们需要使用新数据
为了让您了解PHP中的情况,我会:

在我的数据访问对象中:

function getAllPortal() {
    $sql = "select firstname, lastname, U.* from person, portal_user U where id=person order by firstname, lastname";
    $prep = $this->db->prepare($sql);
    return $prep->execute();
}
在我的http服务(基于rest)代码中:

要在Java中实现这一点,您可能需要创建一些框架,以便将数据输出到映射列表中(或者您希望传输到客户机的其他简单结构)。我用PHP做了一个这样做的,也允许使用准备好的语句

<强>其他可以考虑的(<>强)>(即使你没有如上所述)也可以是:

避免分层。尽量少吃。如果您使用Hibernate,请接受它。直接在查询中使用这些对象,并将它们转换为json并发送出去。如果有几个人(或客户机)需要使用您的数据,这些层会使您的代码变得健壮—它们使您的代码不愿意快速更改。知道什么时候分层,什么时候不分层是诀窍,并尽可能地抵制它。编写层需要时间


使用XML或更好的JSON作为传输工具。不要选择抵制xml和POJO序列化等更改的模式。POJO在业务逻辑方面很好,但在数据传输方面很差。如果您的客户机足够瘦,就不要再麻烦将json反序列化为对象。直接使用JSON。同样,与层一样,诀窍是知道何时重新创建POJO会带来业务价值,何时不会。和图层一样,在看到价值之前,不要投入工作。编写/维护反序列化程序需要时间。

您正在处理来自不同来源的相同数据。即,您是否使用此数据填充相同的业务模型对象?如果不是,我怀疑整个方法是否有意义……我的想法是,这将是一种处理本地数据/web服务等的统一模式(这些是开发时间短的小型移动应用程序,原型通常只有本地数据等)。对于每个项目,数据来源有时是可变的,但对于不同的项目,数据和模型肯定是不同的!:)对不起,我不明白这应该怎么做。解析是按照您的业务逻辑处理数据,显然这种逻辑和数据会发生变化,所以您需要在某个时候使用特定的方法。在进行特定转换之前,逐层构建不会有任何好处。对我来说,唯一有意义的抽象层是包装解析器的细节,这样您就只有一个myObject=loadData()的高级调用;或加载数据(myObject);,因此,您可以快速替换实际的解析器实现。
    $accPerson = new AccountPerson($db);
    echo json_encode($accPerson->getAllPortal());