Правильная реализация передачи аргументов

Всех приветствую. Делаю приложение для управления кое-чем с геймпада или с тачскрина телефона.

Есть абстрактный класс Controller с абстрактными методами.

Для класса Gamepad нужен MotionEvent, чтобы определить положение стиков, триггеров и т.д

Для Touchpad нужны кнопки, Seekbar.

Для управления я создаю класс Controller, но вот вопрос:

Как правильно передать onGenericMotion классу Gamepad, а классу Touchpad - кнопку и seekbar?

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

Если как-то передать классу Touchpad прям конкретно 2 класса Seekbar и 1 кнопку - то для расширения функциональности нужно будет переписывать много чего.

Как лучше быть? Ведь не каждый контроллер это геймпад или тачпад

import com.spacetechnoogies.upvehcontroller.ControllerMessage;

public abstract class Controller {

    ControllerMessage message;

    public ControllerMessage getControllerMessage(){
        return this.message;
    }

    public abstract float getMinThrottle();
    public abstract float getMaxThrottle();
    public abstract float getMinSteering();
    public abstract float getMaxSteering();
}


public class Gamepad extends Controller implements MotionEventListener {

    @Override
    public void onMotionEvent(MotionEvent event){
        if (event.getSource() != InputDevice.SOURCE_DPAD) {

            float steering = event.getAxisValue(MotionEvent.AXIS_X);
            float throttle =  event.getAxisValue(MotionEvent.AXIS_RY);
            float brake =  event.getAxisValue(MotionEvent.AXIS_RX);

            if (throttle > brake) {
                message.setReverse(false);
                message.setThrottle(throttle);
            } else if (throttle < brake) {
                message.setReverse(true);
                message.setThrottle(brake);
            } else {
                message.setReverse(false);
                message.setThrottle(0.0f);
            }

            message.setSteering(steering);

        }
    }

    @Override
    public float getMinThrottle() {
        return 0.0f;
    }

    @Override
    public float getMaxThrottle() {
        return 1.0f;
    }

    @Override
    public float getMinSteering() {
        return 0.0f;
    }

    @Override
    public float getMaxSteering() {
        return 1.0f;
    }
}

import android.view.MotionEvent;

import java.util.ArrayList;
import java.util.List;

public class ControllerEventManager {

    private List<MotionEventListener> listeners = new ArrayList<>();

    public void subscribe(MotionEventListener listener){
        listeners.add(listener);
    }

    public void unsubscribe(MotionEventListener listener){
        listeners.remove(listener);
    }

    public void notify(MotionEvent event){
        for (MotionEventListener listener : listeners){
            listener.onMotionEvent(event);
        }
    }

}

public interface MotionEventListener {
    void onMotionEvent(MotionEvent event);
}

public class ControllerMessage {
    private float throttle;
    private float steering;

    public float getThrottle() {
        return throttle;
    }

    public void setThrottle(float throttle) {
        this.throttle = throttle;
    }

    public float getSteering() {
         return steering;
     }

    public void setSteering(float steering) {
        this.steering = steering;
    }

    public boolean getIsReverse() {
        return isReverse;
    }

    public void setReverse(boolean reverse) {
        isReverse = reverse;
    }

    private boolean isReverse;
}

Ответы (0 шт):