在Web应用程序中,我想执行一些属于不同类的方法。方法调用将在链中进行(第一种方法调用第二种,第二种调用第三种......等等)。每种方法都会在一些散列图或其他数据结构中进行一些输入或更新。执行完所有方法后,我必须在数据库中进行一些更新。基于存储在哈希映射中的值。
根据我的理解,我有以下选项来实现这一目标:
继续将哈希映射从一种方法传递到另一种方法。 我认为这是一个糟糕的方法。
将这些哈希映射保存在单独的类中。创建该类的对象并使该对象从一个方法传递到另一个方法,依此类推。 这个方法看起来比第一个好,但它仍然涉及将一个对象从一个对象传递到另一个对象导致紧密耦合的设计。
使用静态哈希映射 (或哈希表)或单独类的静态对象,如选项2所示。 (我认为这是更糟糕的方法,因为静态变量将在不同用户之间共享)。
请帮助我理解最佳方法。
答案 0 :(得分:1)
您可以应用构建器模式以避免在方法之间传递参数。它提供了在一个类中构建所有必要操作并在链中调用它们的机会。
假设您在地图上有3个操作,我已经演示了在此场景中使用构建器设计模式
public class MyMap {
Map<String, String> map;
public MyMap(MyMapBuilder builder) {
this.map = builder.map;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public static class MyMapBuilder {
Map<String, String> map;
public MyMapBuilder() {
this.map = new HashMap<String,String>();
}
public MyMapBuilder doOperationOne() {
new OperationOne().run(map);
return this;
}
public MyMapBuilder doOperationTwo() {
new OperationTwo().run(map);
return this;
}
public MyMapBuilder doOperationThree() {
new OperationThree().run(map);
return this;
}
public MyMap build() {
return new MyMap(this);
}
}
}
这是你的操作类(虚拟操作为例)
public class OperationOne {
public void run(Map<String, String> map) {
map.put("OpOne", "1");
}
}
public class OperationThree {
public void run(Map<String, String> map) {
map.put("OpThree", "3");
}
}
public class OperationTwo {
public void run(Map<String, String> map) {
map.put("OpTwo", "2");
}
}
以下是最后一次调用的方式
MyMap resultMap = new MyMap.MyMapBuilder().doOperationOne().doOperationTwo().doOperationThree().build();
resultMap对象保留结果Map。
答案 1 :(得分:0)
如果你想走OO路线,你不应该把这个问题想象成&#34;数据&#34;经历转型。
考虑所有的含义。使其成为您域中某些东西的对象之间的协作。你到底想要的是什么?一个Report
?一个Chart
?一个Price
?按名称调用并创建它。
同样,没有转换。如果从域的角度来看,您可以命名(并创建)中间结果。例如,要创建Report
,您可能首先需要Template
,或者其他任何内容。
简而言之,这些解决方案对我来说都不是特别面向对象。但是,您可以将其称为功能(如果方法是纯函数),在这种情况下,解决方案#1或#2都可以工作。
答案 2 :(得分:0)
更改多个内部数据结构(属于不同的类)使得传入Web请求的处理完全有状态。它可能导致并发问题或缓慢(如果您负责所有锁定)。如果最终目标是对数据库进行一些更新,那么要么在流程中同步进行更新,要么“排队”这些事件(内部/外部)并异步处理它们。每个队列记录都可以保存有关数据库更新的信息。对我而言,您的用例与“日志记录”非常相似。日志记录框架还需要从多个方法更新日志文件(同时处理单个请求)。