什么OOP模式可用于在多个;“步骤”;上课?

什么OOP模式可用于在多个;“步骤”;上课?,oop,design-patterns,Oop,Design Patterns,在OOP中,所有东西都是具有自己属性和方法的对象。但是,您通常希望运行一个流程,该流程跨越需要按顺序运行的多个步骤。例如,您可能需要下载一个XML文件,解析它并相应地运行业务操作。这至少包括三个步骤:下载、解组、解释解码请求 在一个非常糟糕的设计中,你会在一个方法中完成这一切。在稍微好一点的设计中,您可以将单个步骤放在方法中,或者更好地放在新类中。因为您想要测试和重用单个类,所以它们不应该相互了解。在我的例子中,一个中央控制类按顺序运行它们,将一个步骤的输出传递给下一个步骤。我注意到这样的控制和

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

在一个非常糟糕的设计中,你会在一个方法中完成这一切。在稍微好一点的设计中,您可以将单个步骤放在方法中,或者更好地放在新类中。因为您想要测试和重用单个类,所以它们不应该相互了解。在我的例子中,一个中央控制类按顺序运行它们,将一个步骤的输出传递给下一个步骤。我注意到这样的控制和命令类往往增长很快,而且不太灵活或可扩展

因此,我的问题是:什么OOP模式可以用于实现业务流程,何时应用哪种模式?


我目前的研究:

这似乎是我现在正在使用的,但是一些定义说它只是管理“对等”类。我不确定它是否适用于一系列孤立的步骤

当使用上述多个中介时,您可能会将其称为。我想这将解决调解人不够灵活的问题


使用事件(可能与)我可以使单个步骤侦听特殊事件并发送不同的事件。这样,管道非常灵活,但也很难遵循和控制。

责任链最适合这种情况。这几乎就是CoR的定义

如果使用Spring,可以考虑基于该模式的有趣的基于Spring的实现:


显然,没有spring,情况非常相似。

责任链最适合这种情况。这几乎就是CoR的定义

如果使用Spring,可以考虑基于该模式的有趣的基于Spring的实现:


显然,没有spring,情况非常相似。

我相信复合命令(的值)将符合您所描述的。在Eclipse中经常使用这些命令。

我相信复合命令(的一个值)将符合您所描述的。这些应用在Eclipse中很常见。

依赖项注入还不够吗?这使得您的代码可以重用和测试(根据您的要求),并且不需要使用一些复杂的设计模式

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);
    }
}

依赖注入还不够吗?这使得您的代码可以重用和测试(根据您的要求),并且不需要使用一些复杂的设计模式

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);
    }
}

你目前的研究听起来很到位。@Gordon谢谢。我害怕听到这个。我希望有更好的解决办法。你目前的研究听起来非常准确。@Gordon谢谢。我害怕听到这个。我希望有更好的解决办法。