2015-08-21 71 views
1

场景:
我有一些处理某种工作流程过程的某些步骤的方法。每个方法在对象中执行某些操作,并将同一对象传递给另一个方法。类似的东西:序列设计模式中的进程

void MethodA(SomeType obj) 
{ 
    // Some Process 

    MethodB(obj); 
} 

void MethodB(SomeType obj) 
{ 
    // Some Process 

    MethodC(obj); 
} 

void MethodC(SomeType obj) 
{ 
    // keep going... 
} 

并发症:
该系统的增长,我发现我需要把这种“的步骤队列”系统中的一些不同的地方。但是到了其他地方,几个步骤会改变,有些不能执行,需要执行新的步骤。一般来说,队列变化但步骤不变。

问题
有没有一种设计模式,让我建立单独的步骤只有加入他们的行列,当我需要运行?

+1

而不是由方法调用下一个,有一个逻辑名称的包装方法调用它们按顺序而不是。基本上将工作从序列中分离出来。例如,'void DoSomeSequence(SomeType obj){MethodA(obj);方法b(OBJ); MethodC(OBJ); } void DoSomeOtherSequence(SomeType obj){MethodA(obj); MethodC(OBJ); MethodZ(OBJ); }'这样的事情会解决吗? –

+1

你可能想看看命令模式。这是真正用于排序多个命令。很像其他例子/答案。 –

+0

你重用队列吗? – michaelsnowden

回答

2

不知道有关的设计模式,但你可以如下做到这一点:

void Method(SomeType obj) 
{ 
    MethodA(obj); 
    MethodB(obj); 
    MethodC(obj); 
} 

void MethodA(SomeType obj) 
{ 
} 

void MethodB(SomeType obj) 
{ 
} 

void MethodC(SomeType obj) 
{ 
} 

通过这种方式,你可以随时随地你想重新排列这些方法。

+0

通常[模板方法](https://en.wikipedia.org/wiki/Template_method_pattern)设计模式包含'MethodX'方法的'virutal' /'abstract' ...否则非常合理。 –

+0

在仔细思考其他答案之后,我注意到将这种问题带入设计模式会使我的代码变得更复杂,而没有一个答案。所以我决定去解决你的问题。 –

2

您可以使用生成器模式:

public class MyObject { 

    public static class MyObjectBuilder { 
     private MyObject obj; 
     public MyObjectBuilder() { 
      obj = new MyObject(); 
     } 

     public MyObjectBuilder methodA() { 
      // edit something with obj 
      return this; 
     } 

     public MyObjectBuilder methodB() { 
      // edit something with obj 
      return this; 
     } 

     public MyObjectBuilder methodC() { 
      // edit something with obj 
      return this; 
     } 

     public MyObject build() { 
      return obj; 
     } 
    } 

    public static void main(String[] args) { 
     MyObject a = new MyObjectBuilder() 
       .methodA() 
       .methodB() 
       .methodC().build(); 
     MyObject b = new MyObjectBuilder() 
       .methodA() 
       .methodA() 
       .methodB() 
       .methodB().build(); 
     MyObject c = new MyObjectBuilder() 
       .methodC() 
       .methodB() 
       .methodA() 
       .methodC() 
       .methodB().build(); 
    } 
} 
+0

这很有趣,它与jQuery是一样的吗? +1。 –

+0

我很抱歉,但我还没有与jQuery合作过。 –

+0

@JonnyPiazzi类 - 据我所知,jQuery没有构建器,但它确实使用流畅的接口模式。这两件事情非常相似。 – michaelsnowden