这个 "call-inversion" 模式有名字吗?

Does this "call-inversion" pattern have a name?

我刚刚回答了另一个问题(Select method based on field in class),我想知道这个模式是否有名字。

调用 action.applyX(a),其中 X 取决于 a 的某些 属性(例如示例中的 type),因此您改为调用 a.apply(action) 并让 a(或 Type)调用适当的 applyX.

有名字吗?

public enum Type {
    INTEGER {
        @Override
        public void apply(Action action, A a) {
            action.applyInteger(a);
        }
    },
    STRING {
        @Override
        public void apply(Action action, A a) {
            action.applyString(a);
        }
    };
    public abstract void apply(Action action, A a);
}

public interface Action {
    public void applyInteger(A a);
    public void applyString(A a);
}

public class A {
    private Type type;
    ...
    public void apply(Action action) {
        this.type.apply(action, this);
    }
}

更新

以上只是一个例子,使用type作为选择器并不是重点。

决定调用哪个 X 方法的选择标准可以是任何东西。在骰子游戏中,X 可能是 'Odd' 或 'Even',而 class A 可能是 'Dice',其中 1-6 int值。

该示例使用抽象 enum 方法来避免 switch 语句(不易出错)。抽象方法实现是一种切换技术,本例中选择合适的方式X.

更新 2

这个问题是关于用于避免在 class (A) 之外执行 "action" 逻辑的 switch 语句的模式,而不是关于改变 [=23= 的行为] (strategy/policy),其中 "switch choices" 定义明确,例如作为类型枚举(上面的示例),或由 A.

的众所周知的子classes

例如,A 可以定义 table 列。 class 不应与实现代码紧密耦合,但会有许多不同的实现方法 ("Actions") 必须以不同方式处理列类型。

操作可能是在 ResultSet 上调用适当的 getXxx 方法,在 PreparedStatement 上调用适当的 setXxx 方法,格式化值以显示,呈现它XML 或 Json,解析值,...

所有这些方法都需要 switch 语句, 它们可以使用 "typed" 方法实现一个接口,并询问 class "please call the right one for me".

这个问题越来越长了。对不起,如果我没有清楚地说明模式。

我认为这个名称只是使用的语言功能的名称,polymorphism

看起来像函数式语言中的类型分解

我会说这是使用 strategy pattern 的示例。维基百科文章中的示例(用 C# 编写)也使用了枚举。

这是一个Strategy Pattern

的开始

这是一个行为模式,与更常见的结构模式相对。

在您的示例中,您没有充分利用该模式。由于您对所有策略使用单一界面

In computer programming, the strategy pattern (also known as the policy pattern) is a software design pattern that enables an algorithm's behavior to be selected at runtime.

这类似于 Visitor pattern,因为您基本上是在不更改 A 的情况下添加新操作(您将其操作外化到单独的 class)。

this.type.apply(action, this);

扮演的角色:

visitor.visit(this);

如果添加了新操作(例如 applyBoolean),如果您使用 switch 语句,则需要更改 A 的代码。但是,在您的实现中,您只需使用新的访问者 subclass(一个新的 Type 枚举常量),它实现了原本会放置在 A.

中的代码。