Java实现火车票售票系统

一.思路

首先需要一个火车票实体Ticket,用来充当火车票角色;

其次需要一个单例的售票系统TicketSystem,用来售卖火车票;

最后需要具体的售票处Window,用来买票;

二.实现

1.火车票实体Ticket

class Ticket {
    // 起始站
    private String start;
    // 终点站
    private String end;
    // 票价,用BigDecimal防止后续需要计算,能保证精度
    private BigDecimal price;

    public Ticket() {

    }

    public Ticket(String start, String end, BigDecimal price) {
        this.start = start;
        this.end = end;
        this.price = price;
    }

    public String getStart() {
        return start;
    }

    public String getEnd() {
        return end;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setStart(String start) {
        this.start = start;
    }

    public void setEnd(String end) {
        this.end = end;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Ticket{" +
                "start='" + start + '\'' +
                ", end='" + end + '\'' +
                ", price=" + price +
                '}';
    }
}

2.单例线程安全的售票系统

// 单例系统,双重校验锁
class TicketSystem {

    private volatile static TicketSystem system = new TicketSystem();
    // 存储所有车票,其中CopyOnWriteArrayList保证线程安全读写
    private CopyOnWriteArrayList<Ticket> list = new CopyOnWriteArrayList<>();

    // 给车票赋值,类加载前就给list车票集合赋值
    {
        for (int i = 0; i < 100; i++) {
            list.add(new Ticket("北京" + i, "深圳" + i, new BigDecimal(i * 200 + 100)));
        }
    }

    private TicketSystem() {

    }

    // 双重锁校验生成系统对象
    public static TicketSystem getSystem() {
        if (system == null) {
            synchronized (TicketSystem.class) {
                if (system == null) {
                    system = new TicketSystem();
                }
            }
        }
        return system;
    }

    // 买票方法
    public Ticket sellTicket() {
        try {
            return list.remove(0);
        } catch (IndexOutOfBoundsException e) {
            // 发生异常说明票卖完了
            return null;
        }
    }
}

3.售票窗口WIndow

// 当前窗口
class Window extends Thread {
    //当前窗口名称
    private String winName;

    public Window(String winName) {
        this.winName = winName;
    }

    public String getWinName() {
        return winName;
    }

    public void setWinName(String winName) {
        this.winName = winName;
    }

    @Override
    public void run() {
        this.sellTicket();
    }

    // 买票系统
    public void sellTicket() {
        TicketSystem system = TicketSystem.getSystem();
        while (true) {
            Ticket ticket = system.sellTicket();
            if (ticket != null) {
                System.out.println("从" + this.winName + "售出一张票" + ticket);
            } else {
                System.out.println(this.winName + "票卖光了");
                break;
            }
        }
    }
}

测试类:

class Test {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            Window window = new Window("北京" + i + "站");
            window.start();
        }
    }
}

总结:运用了双重校验锁的单例模式写售票系统,实现了类的复用,不会被频繁的创建和销毁,节省了时间和空间资源。通过CopyOnWriteArrayList实现线程安全的集合。

拓展:TicketSystem中的票的起始站,票的数量能否自定义呢,更灵活,符合实际场景?

  • 4
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供一些关于Java实现火车票售票系统的建议,并且可以帮您实现售票页面的代码。 首先,您需要确定系统需要哪些功能,例如售票、查询、退票等。这些功能可以作为系统的主要模块,每个模块需要一个对应的界面。 对于售票模块,您需要设计相应的界面,可以使用Java Swing等GUI工具包进行设计。以下是一个简单的售票界面代码示例: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TicketSystem extends JFrame implements ActionListener { private JLabel lblTitle; private JLabel lblFrom; private JLabel lblTo; private JLabel lblDate; private JTextField txtFrom; private JTextField txtTo; private JTextField txtDate; private JButton btnSearch; private JButton btnBuy; public TicketSystem() { setTitle("火车票售票系统"); setSize(400, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 添加标题标签 lblTitle = new JLabel("请输入车票信息:"); lblTitle.setFont(new Font("微软雅黑", Font.BOLD, 16)); lblTitle.setBounds(20, 20, 200, 30); add(lblTitle); // 添加出发地标签和文本框 lblFrom = new JLabel("出发地:"); lblFrom.setBounds(20, 60, 60, 20); add(lblFrom); txtFrom = new JTextField(); txtFrom.setBounds(80, 60, 100, 20); add(txtFrom); // 添加目的地标签和文本框 lblTo = new JLabel("目的地:"); lblTo.setBounds(200, 60, 60, 20); add(lblTo); txtTo = new JTextField(); txtTo.setBounds(260, 60, 100, 20); add(txtTo); // 添加日期标签和文本框 lblDate = new JLabel("日期:"); lblDate.setBounds(20, 100, 60, 20); add(lblDate); txtDate = new JTextField(); txtDate.setBounds(80, 100, 100, 20); add(txtDate); // 添加查询和购买按钮 btnSearch = new JButton("查询"); btnSearch.setBounds(80, 150, 80, 30); btnSearch.addActionListener(this); add(btnSearch); btnBuy = new JButton("购买"); btnBuy.setBounds(200, 150, 80, 30); btnBuy.addActionListener(this); add(btnBuy); setLayout(null); setVisible(true); } public void actionPerformed(ActionEvent e) { if (e.getSource() == btnSearch) { // 处理查询按钮事件 // TODO } else if (e.getSource() == btnBuy) { // 处理购买按钮事件 // TODO } } public static void main(String[] args) { new TicketSystem(); } } ``` 在这个示例中,我们使用了JFrame类来创建售票界面,并且添加了出发地、目的地、日期等信息的输入框和查询、购买等按钮。当用户点击按钮时,可以通过ActionListener接口实现相应的事件处理逻辑。 需要注意的是,这只是一个简单的示例代码,您需要根据自己的实际需求进行修改和完善。 希望以上建议对您有所帮助。如果您还有其他问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

psvm_code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值