基于不同服务构建请求的最佳方式/模式

时间:2011-11-04 17:04:28

标签: java python oop design-patterns refactoring

我有大约20种不同的服务,我必须发送请求,这些服务需要稍微不同的标头集。

糟糕的遗留代码是这样的,

row = db.query_for_service()

if row.type == 'foo1'
   // add common headers to request
   // add foo1 specific headers 1
   // add foo1 specific header 2
   // add foo1 specific header 3
else if row.type == 'foo2'
   // add common headers to request
   // add foo2 specific header 1
...
...
...
else if row.type == foo20
   // add common headers to request
   // add foo20 specific header 1
   // add foo20 specific header 2 
   // ...

send_request()

重构这个的最佳方法是什么?我考虑过一些可能在这里工作的模式(策略,建设者),但我不太确定。

我目前正在学习Java和Python,我想了解两种语言中解决方案的不同之处

2 个答案:

答案 0 :(得分:2)

就个人而言,我会做的就是沿着这些方向发展。

#Put this in the initialisation 
Map foos<row.type,String> = new Map<row.type, String>()
#Populate the map 
map.set('a') = 'headerA specific params x=1'
map.set('b') = 'headerB specific params x=2'
map.set('c') = 'headerC specific params y=3'
map.set ...

Map bars<String,String> = new Map<String,String()
bars.set('fooA') = 'a,b'
bars.set('fooB') = 'a,c'
String commonheader = "HTTP/1.1"


#This would be in a method    
row = db.query_for_service()
String output_header += commonheader
for i in bars.get(fooN).split(','):
    output_header += foos.get(i)
send_request()

在伪java / python中。地图将预先填好您需要的所有内容,然后选择您想要的内容并附上。

答案 1 :(得分:1)

您应该尝试模式Command

伪代码如下:

interface Command(){
  void execute();
}

class ConcreteCommandA() implements Command {
  @Override
  void execute(){
    // action 1
  }
}


class ConcreteCommandB() implements Command {
  @Override
  void execute(){
    // action 2
  }
}

并在您的客户端中使用此结构:

Map<String, Command> commands = new HashMap<String, Command>;
  commands.put("action1", new ConcreteCommandA());
  commands.put("action2", new ConcreteCommandB());

runCommand(String str){
  Command command = commands.get(str);
  command.execute();
}

等等