Применение привязок клавиш к переходам состояний при реализации шаблона состояний - PullRequest
1 голос
/ 22 июля 2011

вот вопрос стиля программирования о наилучшей стратегии отображения клавиш ввода на действия в классе, реализующем шаблон состояния.

Я имею дело с двумя классами:

Первый реализует шаблон состояний, который управляет физическим устройством с несколькими состояниями:

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, который извлекает весь ввод с клавиатуры и вызывает соответствующее действие из контроллера устройства, когда нажатая клавиша ввода соответствует (на данный момент) жестко закодированной таблице привязок:

class KeyDemo implements KeyListener {

    DeviceController _controller;
    ...
    @Override
    public void keyPressed(KeyEvent arg0) {
        char key = Character.toUpperCase(arg0.getKeyChar());
        switch (key) {
        case 'A':
            _controller.actionA();
            break;
        case 'B' :
        ...
    }
    ...
}

Существует ли наилучший стиль кодирования для привязки клавиш к действиям в контроллере? Должен ли я пройти через оператор switch, как в примере кода? Мне кажется, что это решение несколько грязный код: не предполагается ли, что шаблон состояния устраняет ненужные if и переключает управляющие структуры?

Спасибо за ваши предложения.

1 Ответ

0 голосов
/ 18 мая 2012

Используя полиморфизм, вы можете достичь своей цели.Я использовал enum, но, возможно, было бы более целесообразно использовать интерфейсы или абстрактный класс, а затем реализовывать каждый из ключевых процессоров.Что ты думаешь?

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 {
}
...