我刚回答了另一个问题(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
语句,或他们可以使用“键入”方法实现接口,并要求班级“请为我打电话给对方”
这个问题变得越来越长。对不起,如果我没有明确说明模式。
答案 0 :(得分:2)
这是一种 Behavorial 模式,而不是更常见的结构模式。
在您的示例中,您没有充分利用该模式。由于您为所有策略使用单一界面
在计算机编程中,策略模式(也称为策略模式)是一种软件设计模式,可以在运行时选择算法的行为。
答案 1 :(得分:0)
我认为这个名称只是所用语言功能的名称polymorphism。
答案 2 :(得分:0)
看起来像在函数式语言中找到的类型分解
答案 3 :(得分:0)
我想说这是使用strategy pattern的一个例子。维基百科文章(用C#编写)中的示例也使用枚举。