接口实现飞机订票系统的一个需求(托运价格计算),需求如下:

时间:2025-02-15 09:22:00

(1) 乘客可以免费托运重量不超过30kg(含30kg)的行李。
(2) 假设行李超过30kg,其收费标准为:

  • 头等舱国内乘客,超重部分每千克收费4元。
  • 其他舱国内乘客,超重部分每千克收费6元。
  • 外国乘客:超重部分每千克比国内乘客多1倍。
  • 残疾乘客:为正常价格的半价。

(3) 行李重量超出部分,不满1kg的按照1kg计算。

代码实现如下:

1、main方法:

package Ticket;

public class Test {
    public static void main(String[] args) {

        ICalcTicket ct = new CalcTicketImpl();
        ();

    }
}

2、接口( ):

package Ticket;

public interface ICalcTicket {

    void CalcTicket();
    
    int levelselect(int x, int y, int level, int moreweight);
    
    int TotalMoney(double weight, int nation, int health, int level);
    
    int IsTrue(int flag);

}

3、接口实现类( ):

package Ticket;

import ;

import static ;

public class CalcTicketImpl implements ICalcTicket {

    private int flag = 0;
    private int money = 0;
    private double weight;
    private int moreweight;
    Scanner scanner = null;
    int[] a = new int[3];
    FormatJudge fj = new FormatJudge();

    public void CalcTicket() {

        while (true) {
            scanner = new Scanner();
            ("Please enter weight in KG (with two decimal places):");
            try {
                weight = ();
                break;
            } catch (Exception e) {
                ("输入信息不符合要求,请重新输入!");
            }
        }
        if (weight < 30) {
            ("Your luggage will be free to carry!");
        } else {

            //调用IsTrue方法输入国籍,健康状况,舱位等级,并将返回值存入数组,作为调用TotalMoney时传入的三个参数
            for (flag = 0; flag <= 2; flag++) {
                int input = IsTrue(flag);
                a[flag] = input;
            }
            money = TotalMoney(weight, a[0], a[1], a[2]);
            ("You should pay ¥ " + money + " .");
        }

    }

    //舱位等级判断
    public int LevelSelect(int x, int y, int level, int moreWeight) {
        
        switch (level) {
            case 1:  //first class
                money = moreWeight * x;
                break;
            case 2:  //other classes
                money = moreWeight * y;
                break;
            default:
                break;
        }
        return money;
    }

    //计算运费
    public int TotalMoney(double weight, int nation, int health, int level) {

        moreweight = (int) ceil(weight - 30);
        if (nation == 1) {    //domestic
            if (health == 1) {    //disabled
                money = LevelSelect(2, 3, level, moreweight);
            } else {    //healthy
                money = LevelSelect(4, 6, level, moreweight);
            }
        } else {  //foreigner
            if (health == 1) {  //disabled
                money = LevelSelect(4, 6, level, moreweight);
            } else {  //healthy
                money = LevelSelect(8, 12, level, moreweight);
            }
        }
        return money;
    }

    //输入国籍,健康状况,舱位等级三个参数并捕捉输入异常
    public int IsTrue(int flag) {
        int input;
         = flag;

        while (true) {
            scanner = new Scanner();
            if (flag == 0) {
                ("Please enter '1' or '2' (1:domestic, 2:foreigner):");
            } else if (flag == 1) {
                ("Please enter '1' or '2' (1:disabled, 2:healthy):");
            } else if (flag == 2) {
                ("Please enter '1' or '2' (1:first class, 2:other classes):");
            }

            //捕捉两个异常,一个是异常,一个是自定义异常
            try {
                input = ();
                (input);
                break;
            } catch (Exception e) {
                ("输入信息不符合要求,请重新输入!");
            }
        }
        return input;
    }
}

4、自定义异常类( ):

package Ticket;

//自定义异常
public class FormatException extends Exception {
    public FormatException() {
        super();
    }
}

//将输入的值是int类型但不是1或2的异常抛出
class FormatJudge {
    public void judge(int m) throws FormatException {
        if (m != 1 && m != 2) {
            throw new FormatException();
        }
    }
}