在OOP中,一切都是具有自己的属性和方法的对象。但是,通常您希望运行跨越需要按顺序运行的多个步骤的进程。例如,您可能需要下载XML文件,解析它并相应地运行业务操作。这包括至少三个步骤:下载,解组,解释已解码的请求。
在一个非常糟糕的设计中,你可以用一种方法完成这一切。在稍好的设计中,您可以将单个步骤放入方法中,或者更好的是将新类放入。由于您希望测试和重用单个类,因此他们不应该彼此了解。在我的例子中,一个中央控制类按顺序运行它们,获取一步的输出并将其传递给下一步。我注意到这样的控制和命令类往往会快速增长,而不是灵活或可扩展。
我的问题是:可以使用哪些OOP模式来实现业务流程以及何时应用哪一个?
到目前为止我的研究:
mediator pattern似乎就是我现在正在使用的,但有些定义说它只管理" peer"类。我不确定它是否适用于一系列孤立的步骤。
当使用多个上述调解器时,您可以将其称为strategy pattern。我想这可以解决调解员不灵活的问题。
使用事件(可能与Chain of Responsibility pattern相关)我可以让单个步骤侦听特殊事件并发送不同的事件。这种方式管道非常灵活,但也难以跟踪和控制。
答案 0 :(得分:1)
责任链是这种情况下最好的。它几乎是CoR的定义。
如果您使用的是弹簧,可以考虑使用这种模式的有趣的基于弹簧的实现: https://www.javacodegeeks.com/2012/11/chain-of-responsibility-using-spring-autowired-list.html
显然没有弹簧,它非常相似。
答案 1 :(得分:1)
依赖注入不足够吗?这使您的代码可重用且可测试(按照您的要求),无需使用某些复杂的设计模式。
public final class SomeBusinessProcess {
private final Server server;
private final Marshaller marshaller;
private final Codec codec;
public SomeBusinessProcess(Server server, Marshaller marshaller, Codec codec) {
this.server = server;
this.marshaller = marshaller;
this.codec = codec;
}
public Foo retrieve(String filename) {
File f = server.download(filename);
byte[] content = marshaller.unmarshal(f);
return codec.decode(content);
}
}
答案 2 :(得分:0)
我相信复合命令(Command Pattern的视觉效果)适合你描述的内容。这些应用程序在Eclipse中很常见。