[英]Strategy Pattern: How to make classes with constructors as enums?
我正在用Java创建策略模式。
这是我的策略界面ActivationStrategy.java :
public interface Strategy {
public void strategyAlgo(JTextField textField);
}
我有实现接口的不同类。 这些类具有构造函数,因为必须传递值。 例如:
FirstStrategy.java
public class FirstStrategy implements Strategy{
private JComboBox<String> _comboBox;
public FirstStrategy(JComboBox<String> comboBox) {
_comboBox = comboBox;
}
public void strategyAlgo(JTextField textField) {
textField.addKeyListener(new myKeyHandler(_comboBox, textField));
}
SecondStrategy.java
public class SecondStrategy implements Strategy{
private JPanel _panel;
public secondStrategy(JPanel panel) {
_panel = panel;
}
public void strategyAlgo(JTextField textField) {
addActionHandlerToButton(addButton(_panel));
}
public JButton addButton(JPanel panel) {
JButton button = new JButton("Click me");
panel.add(button);
return button;
}
public void addActionHandlerToButton(JButton okButton) {
Action action = new AbstractAction(){
public void actionPerformed(ActionEvent e) {
System.out.println("Hi");
}
};
button.addActionListener(action);
}
}
现在,我想将这些类作为枚举。 就像是:
public enum strategies {
FIRSTSTRATEGIE(){
@Override
public void strategyAlgo() {
...
}
},
SECONDSTRATEGY(){
@Override
public void strategyAlgo() {
...
}
public JButton addButton(JPanel panel) {
...
}
public void addActionHandlerToButton(JButton okButton) {
...
}
};
public abstract void strategyAlgo();
}
但是构造函数呢?
enum
是可行的选择吗?
在您的情况下,标准2.
是不true
。 因此,我认为您不应将策略建模为enum
。
您不能在运行时创建枚举的任意实例。 因此,您不能将任何在编译时未知的东西传递给枚举的构造函数。 您可以通过更改抽象方法中的参数列表来传递动态参数。
您可以在Enum中创建构造函数,但只能是private
,因此您不能在运行时使用它来创建任意实例。 这样可以保证只有一个特定枚举值的实例。
例如:
public enum Suit {
SPADES("spades"),
HEARTS("hearts"),
CLUBS("clubs"),
DIAMONDS("diamonds");
private String label;
private Suit(String label) {
this.label = label;
}
}
顺便说一句,对于enum
, private
关键字对于构造函数是可选的。 默认情况下是private
的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.