这个 "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
.
中的代码。
我刚刚回答了另一个问题(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.
例如,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
.