1. 设计背景
伴随互联网的蓬勃发展,网络购书系统作为电子商务的一种形式, 正以其高效、低成本的优势逐步成为新兴的经营模式,互联网的用途也不再局限于信息的浏览和发布,人们能够充分享受互联网带来的更多便利。网络购书系统正是适应了当今社会快节奏的生活,使顾客足不出户便可以方便、快捷、轻松地选购自己喜欢的图书。
2.要求
本案例要求使用所学知识编写一个基于控制台的购书系统, 实现购书功能。程序输出所有图书的信息,包括每本书的编号、书名、单价、库存。
顾客购书时,根据提示输人图书编号选购需要的书,并根据提示输人需要购买的书的数量。购买完毕输出顾客的订单信息,包括订单号、订单明细、订单总额。
3. 设计思路
由题可知,我们需要先创建3个类:分别是书类、订单类,以及订单中的订单信息(购买的书名、购买的数量、书的单价)——订单项类。
- 书类(Book)
属性:书的编号、书名、书的价格、书的库存 - 订单类(Order)
属性:订单号、订单总额、订单项数组 - 订单项类(OrderItem)
属性:购买的数量、购买的书名、所购图书的价格
另外,我们在系统中还需要将订单项里的内容添加到订单中,还需要在订单中获取所购买的书的各项信息,因此我们需要在订单类里构造以上这些方法。
4. 代码演示
4.1 Book类的实现
书籍类的属性有:图书的编号,书名、图书价格、图书库存, 我们结合封装性,将属性设置为private
权限,并提供相应的get
方法和set
方法,空参构造器,以及带有全部参数的构造器。代码实现如下:
package book; // 图书类 public class Book { private String id;// 图书编号 private String name;// 书名 private double price;// 价格 private int nums;// 库存 public Book() { } public Book(String id, String name, double price, int nums) { this.id = id; this.name = name; this.price = price; this.nums = nums; } // get方法和set方法 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getNums() { return nums; } public void setNums(int nums) { this.nums = nums; } }
4.2 OrderItem类实现
订单项类的属性有:购买的书名,购买书籍的数量,书籍的价格,我们结合封装性,将属性设置为private
权限,并提供相应的get
方法和set
方法,空参构造器,以及带有全部参数的构造器。代码实现如下:
package order; // 订单项类 public class OrderItem { private String name;// 购买的书名 private int nums;// 购买的数量 private double price;// 价格 public OrderItem() { } public OrderItem(String name, int nums, double price) { this.name = name; this.nums = nums; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getNums() { return nums; } public void setNums(int nums) { this.nums = nums; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } }
4.3 Order类实现
订单类的属性有:订单号,订单总价,订单项数组(对添加的订单进行存储)
订单类主要提供:添加订单项的方法以及打印订单信息的方法,具体代码实现如下:
package order; // 订单类 public class Order { private String OrderId; // 订单号 private double total; // 订单总价 OrderItem[] items = new OrderItem[100]; public Order() { } public Order(String OrderId) { this.OrderId = OrderId; } // 添加订单项的方法 public void AddOrderItem(OrderItem item){ // 在数组空的位置插入 for (int i = 0; i < items.length; i++) { // 找数组中空的位置插入 if (items[i] == null){// 当前位置为空 items[i] = item; return; } } } // 打印订单信息 public void printOrder() { System.out.println("====================="); System.out.println("订单号:" + OrderId); System.out.println("书名\t\t单价\t\t数量"); for (OrderItem item: items) { if (item != null) { System.out.println(item.getName()+"\t\t" + item.getPrice() + "\t\t" + item.getNums()); // 计算总价 total = total + item.getPrice() * item.getNums(); } } System.out.println("总价:" + total); } }
4.4 Main类
此时,我们所有的框架都已经搭建好了,只需要在Main类中添加main方法进行测试即可,代码如下:
import book.Book; import order.Order; import order.OrderItem; import java.util.Scanner; public class Main { public static void main(String[] args) { Book[] books = new Book[3]; books[0] = new Book("001","数据结构",59.80,20); books[1] = new Book("002","程序设计",48.80,2); books[2] = new Book("003","信息技术",25.4,12); Order order = new Order("2023001");// 生成订单号 Scanner input = new Scanner(System.in); while (true) { // 打印订单信息 System.out.println("编号\t\t书名\t\t\t单价\t\t库存\t"); for (int i = 0; i < books.length; i++) { System.out.println(books[i].getId() + "\t\t" + books[i].getName() + "\t\t"+ books[i].getPrice() + "\t"+ books[i].getNums()); } System.out.println("请输入您要购买书的编号"); String inputId = input.next(); System.out.println("请输入购买数量"); int inputNum = input.nextInt(); switch (inputId) { case "001": if (inputNum > books[0].getNums()){ // 购买的的数量大于库存 System.out.println("库存不足,请重新输入!"); System.out.println("当前库存为:" + books[0].getNums()); break; }else { books[0].setNums(books[0].getNums() - inputNum);// 剩余库存 // order.AddOrderItem(new OrderItem(books[0].getName(), inputNum,books[0].getPrice())); break; } case "002": if (inputNum > books[1].getNums()){ // 购买的的数量大于库存 System.out.println("库存不足,请重新输入!"); System.out.println("当前库存为:" + books[1].getNums()); break; }else { books[1].setNums(books[1].getNums() - inputNum); order.AddOrderItem(new OrderItem(books[1].getName(), inputNum,books[1].getPrice())); break; } case "003": if (inputNum > books[2].getNums()){ // 购买的的数量大于库存 System.out.println("库存不足,请重新输入!"); System.out.println("当前库存为:" + books[2].getNums()); break; }else { books[2].setNums(books[2].getNums() - inputNum);// 剩余库存 order.AddOrderItem(new OrderItem(books[2].getName(), inputNum,books[2].getPrice())); break; } } System.out.println("是否继续购书?请选择Yes/No"); String next = input.next(); if (next.equals("No")){ break; } } order.printOrder(); } }
5. 整体效果测试