我剛剛回答了另一個問題(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
可能是'Odd'或'Even',而A
可能是'Dice',其值爲1-6 int
。
該示例使用抽象enum
方法作爲避免switch
語句(較少出錯)的方式。抽象方法的實現是一種交換技術,在這種情況下,選擇適當的方式X
。
更新2
這個問題是關於用於避免開關語句做類(A
)以外「動作」邏輯的圖案,而不是要改變的A
行爲(策略/策略),其中「開關選擇」已被很好地定義,例如作爲類型枚舉(上面的示例),或者通過A的衆所周知的子類。
作爲示例,A
可以定義表列。該類不應與實現代碼緊密耦合,但會有許多不同的實現方法(「操作」)必須以不同的方式處理列類型。
行動可能是適當的getXxx
方法的調用上ResultSet
,調用相應的setXxx
方法上PreparedStatement
,格式化用於顯示的值,使其在XML或JSON,解析值,...
所有這些方法可能需要switch
聲明,或他們可以實現與「類型」方法的接口,並要求班級「請爲我打電話」。
這個問題變得相當長。對不起,如果我不明確說明模式。
戰略模式中剝皮貓的一種方法。 – Roam
當你提出一個合理的問題時,你不討厭它;然後兩年後,有人來不及解釋呢?在您的活動儀表板上發生了-2 ...。有趣的是,我們如何從今天早上的評論中獲益於我的答案;-) – GhostCat