这种"呼叫倒置"模式是否有名称?

And*_*eas 1 java design-patterns

我刚回答了另一个问题(选择基于类中字段的方法),我想知道模式是否有名称.

调用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新

以上只是一个例子,使用type选择器不是重要的部分.

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

该示例使用抽象enum方法作为避免switch语句的方法(不易出错).抽象方法实现是一种切换技术,在这种情况下选择合适的方式X.

更新2

这个问题是关于用于避免切换语句在类(A)之外执行"动作"逻辑的模式,而不是关于改变A(策略/策略)的行为的模式,其中"切换选择"被很好地定义,例如作为类型枚举(上面的例子),或者由众所周知的A子类.

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

操作可能是对相应getXxx方法的ResultSet调用,调用适当的setXxx方法PreparedStatement,格式化显示值,将其呈现为XML或Json,解析值,...

所有这些方法都需要一个switch声明,或者他们可以使用"typed"方法实现一个接口,并要求类"请为我调用正确的".

这个问题变得很长.对不起,如果我没有明确说明模式.

Dra*_*vic 10

这类似于访问者模式,因为您基本上是在A不更改它的情况下添加新操作(您将其操作外部化为单独的类).

this.type.apply(action, this);

扮演的角色是:

visitor.visit(this);

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

  • @Andreas您正好准备好标题的“调用倒置”部分:https://en.wikipedia.org/wiki/Double_dispatch (2认同)