这种“调用 - 反转”模式是否有名称?

时间:2015-08-22 17:29:44

标签: java design-patterns

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

致电action.applyX(a),其中X取决于a的某些属性(例如示例中为type),因此您需要致电a.apply(action)并让{ {1}}(或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可以是“骰子”,价值为1-6 A

该示例使用抽象int方法来避免enum语句(更不容易出错)。抽象方法实现是一种切换技术,在这种情况下是选择适当的switch的方式。

更新2

这个问题是关于用于避免switch语句在类(X)之外执行“action”逻辑的模式,而不是关于改变A(策略/策略)的行为的模式,其中“开关选择”是明确定义的,例如作为类型枚举(上面的例子),或者由A的众所周知的子类。

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

操作可能是调用A上相应的getXxx方法,在ResultSet上调用相应的setXxx方法,格式化显示值,将其渲染为XML或Json,解析值,......

所有这些方法都需要PreparedStatement语句,他们可以使用“键入”方法实现接口,并要求班级“请为我打电话给对方”

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

4 个答案:

答案 0 :(得分:2)

这是Strategy Pattern

的开头

Strategy Pattern Wikimedia

这是一种 Behavorial 模式,而不是更常见的结构模式。

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

  

在计算机编程中,策略模式(也称为策略模式)是一种软件设计模式,可以在运行时选择算法的行为。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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