回答这个问题还真是花费时间,我这边出了个参考的案例,仅供参考,运行结果,麻烦采纳:
IVehicle类:
package vehicle;
/**
* @author darryl
* @date 2022/11/30 10:02
*/
public interface IVehicle {
void setPlace(String place);
void setDestination(String destination);
void run();
}
IDurable类
package vehicle;
/**
* @author darryl
* @date 2022/11/30 10:03
*/
public interface IDurable {
double addFuel(double count);
}
ICar类
package vehicle;
/**
* @author darryl
* @date 2022/11/30 10:04
*/
public class ICar implements IVehicle, IDurable {
@Override
public double addFuel(double count) {
return 0;
}
@Override
public void setPlace(String place) {
}
@Override
public void setDestination(String destination) {
}
@Override
public void run() {
}
}
Factory类
package vehicle;
/**
* @author darryl
* @date 2022/11/30 10:03
*/
public class Factory {
public ICar getByCar() {
BydCar bydCar = new BydCar(1000);
String[] map = new String[]{"北京", "上海", "广州", "深圳"};
bydCar.initMap(map);
return bydCar;
}
}
ConceptCar 类
package vehicle;
/**
* @author darryl
* @date 2022/11/30 10:06
*/
public abstract class ConceptCar extends ICar {
private String place;
private String destination;
private double fuel;
private double distance;
public ConceptCar(double remainder) {
}
@Override
public void run() {
if (this.distance <= 0) {
navigate();
}
engineStart();
while (true) {
if (this.fuel <= 10) {
System.out.println("车辆油料小于10,车辆即将停止");
engineStop();
break;
}
if (this.distance <= 0) {
System.out.println("已经到达目的地,车辆停止");
engineStop();
break;
}
double engineRun = engineRun(this.fuel);
//每次调用从油料单元中 -1
this.fuel = this.fuel - 1;
this.distance = this.distance - engineRun;
System.out.println("当前distance=" + distance);
}
}
@Override
public abstract double addFuel(double fuel);
public abstract void navigate();
public abstract void engineStart();
public abstract double engineRun(double fuel);
public abstract void engineStop();
public String getPlace() {
return place;
}
@Override
public void setPlace(String place) {
this.place = place;
}
public String getDestination() {
return destination;
}
@Override
public void setDestination(String destination) {
this.destination = destination;
}
public double getFuel() {
return fuel;
}
public void setFuel(double fuel) {
this.fuel = fuel;
}
public double getDistance() {
return distance;
}
public void setDistance(double distance) {
this.distance = distance;
}
}
BydCar 类
package vehicle;
/**
* @author darryl
* @date 2022/11/30 10:05
*/
public class BydCar extends ConceptCar {
private String[] map;
public BydCar(double fuel) {
super(fuel);
}
@Override
public double addFuel(double fuel) {
this.setFuel(this.getFuel() + fuel);
return this.getFuel();
}
@Override
public void navigate() {
}
@Override
public void engineStart() {
System.out.println("车辆启动......");
}
@Override
public double engineRun(double fuel) {
return fuel;
}
@Override
public void engineStop() {
}
public void initMap(String[] map) {
this.map = map;
}
}
GasStation 类
package client;
import vehicle.IDurable;
/**
* @author darryl
* @date 2022/11/30 10:25
*/
public class GasStation {
private GasStation() {
}
public static GasStation findGasStation() {
return new GasStation();
}
public void supply(IDurable durable, double fuel) {
durable.addFuel(fuel);
}
}
Entry 类
package client;
import vehicle.Factory;
import vehicle.ICar;
/**
* @author darryl
* @date 2022/11/30 10:18
*/
public class Entry {
public static void main(String[] args) {
Factory factory = new Factory();
ICar car = factory.getByCar();
Driver driver = new Driver();
driver.setCar(car);
driver.drive();
}
}
Driver 类
package client;
import vehicle.ConceptCar;
import vehicle.ICar;
/**
* @author darryl
* @date 2022/11/30 10:20
*/
public class Driver {
private ICar car;
public void setCar(ICar iCar) {
this.car = iCar;
}
public void drive() {
this.car.setPlace("北京");
this.car.setDestination("深圳");
ConceptCar car = (ConceptCar) this.car;
car.setDistance(100);
car.setFuel(20);
while (car.getDistance() > 0) {
this.car.run();
if (car.getFuel() <= 0) {
GasStation.findGasStation().supply(car, 10);
}
}
}
}
补充 navigate
@Override
public void navigate() {
System.out.println("路线设定");
int placeIndex = 0;
int distinationIndex = 0;
for (int j = 0; j < this.map.length; j++) {
if(map[j].equals(this.place)) {
placeIndex = j;
}
if(map[j].equals(this.destination)) {
distinationIndex = j;
}
}
this.distance = distinationIndex-placeIndex>0?(distinationIndex-placeIndex)*10:(placeIndex-distinationIndex)*10;;
}