Взгляните на Интерфейсы .
Основная идея: вы должны заключить договор между вашей Машиной и двигателем, который она может использовать.Какой бы двигатель вы ни подключали к своей Машине, он должен обеспечивать известные методы, чтобы Машина могла управлять им.
Пример интерфейса, который вы можете использовать:
public interface Engine {
public void start();
public void stop();
public void fill(FuelType fuelType, int fuelLevel);
public FuelType getFuelType();
}
Теперь каждый двигатель долженреализовать этот интерфейс:
public class InternalCombustionEngine implements Engine {
public void start() {
//implementation
}
public void stop() {
//implementation
}
public void fill(FuelType fuelType, int fuelLevel) {
//implementation
}
public FuelType getFuelType() {
//implementation
}
}
И наконец, чтобы иметь возможность использовать Engine, вам лучше предоставить конструктор для Machine
класса, принимающего любой объект, который реализуетEngine
интерфейс:
public class Machine {
public Machine(Engine engine) {
this.engine = engine;
}
//.......
}
Этот подход дает вам гибкий и масштабируемый способ замены двигателя или машины независимо друг от друга.И обеспечить хорошую возможность разработки каждого компонента в отдельности.