可以使用哪些OOP模式来实现多个"步骤"类?

时间:2016-09-30 13:14:38

标签: oop design-patterns

在OOP中,一切都是具有自己的属性和方法的对象。但是,通常您希望运行跨越需要按顺序运行的多个步骤的进程。例如,您可能需要下载XML文件,解析它并相应地运行业务操作。这包括至少三个步骤:下载,解组,解释已解码的请求。

在一个非常糟糕的设计中,你可以用一种方法完成这一切。在稍好的设计中,您可以将单个步骤放入方法中,或者更好的是将新类放入。由于您希望测试和重用单个类,因此他们不应该彼此了解。在我的例子中,一个中央控制类按顺序运行它们,获取一步的输出并将其传递给下一步。我注意到这样的控制和命令类往往会快速增长,而不是灵活或可扩展。

我的问题是:可以使用哪些OOP模式来实现业务流程以及何时应用哪一个?

到目前为止我的研究:

mediator pattern似乎就是我现在正在使用的,但有些定义说它只管理" peer"类。我不确定它是否适用于一系列孤立的步骤。

当使用多个上述调解器时,您可以将其称为strategy pattern。我想这可以解决调解员不灵活的问题。

使用事件(可能与Chain of Responsibility pattern相关)我可以让单个步骤侦听特殊事件并发送不同的事件。这种方式管道非常灵活,但也难以跟踪和控制。

3 个答案:

答案 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中很常见。