【发布时间】:2015-08-24 04:18:46
【问题描述】:
我刚刚回答了另一个问题 (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 可以是“奇数”或“偶数”,A 类可以是具有 1-6 int 值的“骰子”。
该示例使用抽象的enum 方法来避免switch 语句(不易出错)。抽象方法实现是一种切换技术,在这种情况下选择合适的X的方式。
更新 2
这个问题是关于用于避免 switch 语句在类之外执行“动作”逻辑的模式 (A),而不是关于更改 A (策略/策略) 的行为,其中“开关选择" 定义明确,例如作为类型枚举(上面的示例),或通过 A 的知名子类。
例如,A 可以定义一个表列。该类不应与实现代码紧密耦合,但会有许多不同的实现方法(“Actions”)必须以不同方式处理列类型。
操作可能是对ResultSet 上的适当getXxx 方法的调用,在PreparedStatement 上调用适当的setXxx 方法,格式化显示的值,将其呈现为XML 或Json,解析值,. ..
所有这些方法要么需要switch 声明,要么他们可以使用“类型化”方法实现接口,并要求类“请为我调用正确的方法”。
这个问题变得很长。对不起,如果我没有清楚地说明模式。
【问题讨论】:
-
在策略模式中给猫剥皮的一种方法。
-
当你提出一个合理的问题时,你不讨厌它吗?然后两年后,有人过来并没有任何解释地投票?碰巧注意到 -2 ... 在您的活动仪表板上。有趣的是,我们都从你今天早上对我的回答的评论中受益;-)
-
我同意这是一种模式,自从我在 1990 年代看到我的第一个面向对象程序以来,我已经看过很多次了。恕我直言,它与访问者模式和策略模式都不完全相同,尽管我看到了两者的关系。换句话说,正如你的问题似乎暗示的那样,如果它有自己的名字会很好。
标签: java design-patterns