策略模式:如何使用构造函数作为枚举类?

时间:2017-04-12 13:38:01

标签: java enums strategy-pattern

我正在用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();

}

但是构造函数呢?

2 个答案:

答案 0 :(得分:1)

enum的标准是可行的选择吗?

  1. 在编译时确定实例数。
  2. 在编译时确定每个实例的状态。
  3. 当您的实例未保持可变状态时。
  4. 在您的情况下,条件2.不是true。因此,在我看来,你不应该将你的策略建模为enum s。

答案 1 :(得分:0)

您无法在运行时创建枚举的任意实例。因此,您无法将任何内容传递给编译时未知的枚举构造函数。 您可以通过更改抽象方法中的参数列表来传递动态参数。

您可以在Enum中创建构造函数,但它只能是private,因此您无法在运行时使用它来创建任意实例。 这样可以保证只有一个特定枚举值的实例。

例如:

public enum Suit {
  SPADES("spades"),
  HEARTS("hearts"),
  CLUBS("clubs"),
  DIAMONDS("diamonds");

  private String label;

  private Suit(String label) {
    this.label = label;
  }

}

BTW,在private的情况下,enum关键字对于构造函数是可选的。它默认为private

相关问题