1

私はJComboBox多くのアイテムを持っています。選択したアイテムを格納するこのコンボ ボックスにアイテム リスナーを追加しました。

    comboBox.addItemListener(new ItemListener() {

        @Override
        public void itemStateChanged(ItemEvent e) {
            option = (String) e.getItem();
        }
    });

ボタンがあり、クリックすると、プログラムはその選択に基づいてタスクを実行します。

ボタン:

public void actionPerformed(ActionEvent e) {
  if (option.toLowerCase().compareTo("contrast stretching") == 0) { /* do sth */ } 
  else if (option.toLowerCase().compareTo("mean") == 0){ /* do sth else */ }
  // And many other else if statements

actionPerformed 関数が長すぎます。コードを書くための最良の方法は何ですか? 単一の関数を長くしすぎたくありません。

4

3 に答える 3

2

Task実行する必要があるタスクを表すインターフェース (例: ) を作成できます。ContrastTask次に、コンボ ボックス ( 、MeanTask、...)の値ごとにこのインターフェイスの実装を作成します。最後に、actionPerformed正しい実装を返すファクトリ メソッドを に記述します。これは、基本的に の正しいインスタンスを返す「スイッチ」になりますTask。次に、このタスクを実行できます...

Task次のようになります。

public interface Task {
  [whatever result it should return] execute([whatever parameters it needs]);
}

実装の1つは次のようになります。

public class MeanTask implements Task {
  public int execute(int a, int b) {
    return (a + b) / 2;
  }
}

工場は次のようになります。

private Task create(String option) {
  if (option.toLowerCase().compareTo("mean") == 0) {
    return new MeanTask();
  }
  else if ....
}

これの利点は、各タスクのロジックが独自のクラスにうまくカプセル化されていることです。

于 2012-08-11T08:36:59.913 に答える
2

これはあなたを助けることができます:

public class Main {
  private Map<String, BaseStrategy> strategyMap = new HashMap<String, BaseStrategy>();

  {
    strategyMap.put("case1", new Strategy1());
    strategyMap.put("case2", new Strategy2());
    strategyMap.put("case3", new Strategy3());
  }

  //...

  public void actionPerformed(ActionEvent e) {
    strategyMap.get(option.toLowerCase()).processEvent();
  }

  abstract class BaseStrategy {

    public abstract void processEvent();

  }

  class Strategy1 extends BaseStrategy {

    @Override
    public void processEvent() {
      //case 1
    }
  }

  class Strategy2 extends BaseStrategy {

    @Override
    public void processEvent() {
      //case 2
    }
  }

  class Strategy3 extends BaseStrategy {

    @Override
    public void processEvent() {
      //case 3
    }
  }
}

キーがコマンドを定義する文字列で、値がイベントを処理する戦略であるマップを作成できます。これで、処理コードを他の Java ファイルに配置して、1 行のコードだけでイベントを処理できるようになりました。


実際、ケースが多すぎる場合は、 Map が適切な戦略をより速く見つけるMapよりも優れています- O(n)ではなくO(ln n )if-else-if-...

于 2012-08-11T08:41:45.410 に答える
0

vektor と Eugene が投稿したように、両方のソリューションを次のように組み合わせます。

public interface Task {
  [whatever result it should return] execute([whatever parameters it needs]);
}

//call this method in your constructor
private void initTasks() {
    this.tasks.put("option1", new Task() {
                public int execute(int a, int b) {
                   return (a + b) / 2;
                }
          });
    //init more tasks
    //this.task.put(..., ...);
}

protected Task getTask(String option) {
     return this.task(option);
}   
于 2012-08-11T09:22:55.713 に答える