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.
| 归档时间: |
|
| 查看次数: |
511 次 |
| 最近记录: |