繁体   English   中英

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

[英]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是可行的选择吗?

  1. 在编译时确定实例数时。
  2. 在编译时确定每个实例的状态时。
  3. 当您的实例不处于可变状态时。

在您的情况下,标准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;
  }

}

顺便说一句,对于enumprivate关键字对于构造函数是可选的。 默认情况下是private的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM