2011-07-21 12 views
1

ここでは、入力パターンを状態パターンを実装するクラスのアクションにマッピングするための最良の戦略についてのプログラミングスタイルに関する質問があります。マルチステート物理デバイス制御状態パターン、第状態パターンを実装するときの状態遷移へのキーバインディングの適用

を実装:

class DeviceController { 
    State _a, _b, _current; 

    // Actions that may prompt a transition from one state to another 
    public void actionA() { ... } 
    public void actionB() { ... } 
    public void actionC() { ... } 

    public State getStateA() { ... } 
    public State getStateB() { ... } 

    public void setCurrentState() { ... } 
}; 

第二は、すべてのキーボード入力を取得するのKeyListenerをして​​

Iは、2つのクラスを扱ってい押された入力キーが(現時点では)ハードコードされたバインディングテーブルと一致するとき、デバイスコントローラから適切なアクションを呼び出す。

Isコントローラー内のアクションにキーをバインドするベストプラクティスのコーディングスタイルがありますか?サンプルコードのようにswitch文を実行する必要がありますか?この解決策はやや汚れたコードであると思われます。ifとswitchの制御構造を解き明かすための状態パターンではないのですか?

あなたのsuggenstionsをありがとうございます。

答えて

0

多型を使用すると、目標を達成できます。私は列挙型を使用しましたが、おそらくインターフェイスまたは抽象クラスを使用し、各キープロセッサを実装することがより適切になるでしょう。どう思いますか?

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

enum KeyProcessor { 
    A { 
     void executeAction() { 
      _controller.actionA(); 
     } 
    }, 
    B { 
     void executeAction() { 
      _controller.actionB(); 
     } 
    }; 

    private static final DeviceController _controller = new DeviceController(); 

    void executeAction() { 
     System.out.println("no action defined"); 
    } 
} 

class DeviceController { 
    State _a; 
    State _b; 
    State _current; 

    // Actions that may prompt a transition from one state to another 
    public void actionA() { 
     System.out.println("action A performed."); 

    } 

    public void actionB() { 
     System.out.println("action B performed."); 
    } 

    public void actionC() { 
    } 

    public State getStateA() { 
     return null; 
    } 

    public State getStateB() { 
     return null; 
    } 

    public void setCurrentState() { 
    } 
} // end class DeviceController 

public class KeyDemo implements KeyListener { 

    DeviceController _controller; 

    // ... 
    @Override 
    public void keyPressed(KeyEvent arg0) { 
     keyPressed(Character.toUpperCase(arg0.getKeyChar())); 
     // ... 
    } 

    public void keyPressed(char c) { 
     KeyProcessor processor = KeyProcessor.valueOf(c + ""); 
     if (processor != null) { 
     processor.executeAction(); 
    } 

    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

    public static final void main(String[] args) { 
     KeyDemo main = new KeyDemo(); 
     main.keyPressed('A'); 
     main.keyPressed('B'); 
    } 
} // end class KeyDemo 

class State { 
} 
関連する問題