【问题标题】:Processes in Sequence design pattern序列设计模式中的流程
【发布时间】:2015-08-21 20:42:23
【问题描述】:

场景:
我有一些方法可以处理一种工作流程过程的某些步骤。每个方法在一个对象中做某事并将同一个对象传递给另一个方法。类似的东西:

void MethodA(SomeType obj)
{
    // Some Process

    MethodB(obj);
}

void MethodB(SomeType obj)
{
    // Some Process

    MethodC(obj);
}

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

并发症:
系统正在增长,我注意到我需要在系统的某些不同位置调用此“步骤队列”。但是到其他地方,一些步骤发生了变化,有些无法执行,需要执行新的。一般来说,队列会发生变化,但步骤不会发生变化。

问题
是否有一种设计模式允许我单独构建步骤并仅在需要运行时才加入它们?

【问题讨论】:

  • 不是让方法调用下一个方法,而是让一个具有逻辑名称的包装器方法按顺序调用它们。基本上将工作与序列分离。例如,void DoSomeSequence(SomeType obj) { MethodA(obj); MethodB(obj); MethodC(obj); } void DoSomeOtherSequence(SomeType obj) { MethodA(obj); MethodC(obj); MethodZ(obj); } 这样的事情行得通吗?
  • 您可能想查看命令模式。它的真正用途是对多个命令进行排序。已经很像其他示例/答案了。
  • 你重复使用队列吗?
  • 为什么要同时标记 Java 和 C#?
  • 因为,它们都是 oop,都是 C 的降序,而且这不是真正的代码问题,只是 oop 和设计模式的问题。所以两者都适合。而且我的代码 sn-p 可以编译成两种语言。

标签: java c# oop design-patterns


【解决方案1】:

您可以使用 Builder 模式:

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

【讨论】:

  • 这很有趣,和jQuery一样吧? +1。
  • @JonnyPiazzi 有点——据我所知,jQuery 没有构建器,但它确实使用了很多流畅的界面模式。这两件事非常相似。
  • 是的,你是对的,既然你说得有道理,我就傻了。 Tnks。
【解决方案2】:

不确定设计模式,但您可以通过以下方式实现:

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

void MethodA(SomeType obj)
{
}

void MethodB(SomeType obj)
{
}

void MethodC(SomeType obj)
{
}

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

【讨论】:

  • 通常template method 设计模式包括virutal/abstract 用于MethodX 方法...否则相当合理。
  • 在认真思考了其他答案之后,我注意到为这个问题引入设计模式会使我的代码变得比没有设计模式更复杂。所以我决定采用你的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 2016-03-23
  • 2016-11-16
相关资源
最近更新 更多