【案例介绍】
- 案例描述
伴随互联网的蓬勃发展,网络购书系统作为电子商务的一种形式,正以其高效、低成本的优势逐步成为新兴的经营模式,人们已经不再满足互联网的用途仅仅局限于信息的浏览和发布,更渴望着能够充分享受互联网所带来的更多便利。网络购书系统正适应了当今社会快节奏地生活,使顾客足不出户便可以方便快捷轻松地选购自己喜欢的图书。
本任务要求,使用所学知识编写一个基于控制台的购书系统,实现购书功能。输出所有图书的信息:包括每本书的编号、书名、单价、库存。
顾客购买书时,根据提示输入图书编号来选购需要的书,并根据提示输入购买书的的数量。
购买完毕后输出顾客的订单信息,包括:订单号、订单明细、订单总额。
- 运行结果

【案例分析】
(1)通过任务描述可知,该系统中必须包括3个实体类,类名及属性设置如下:
- 图书类(Book):
- 图书编号(id)
- 图书名称(name)
- 图书单价(price)
- 库存数量(storage)
- 订单项类(OrderItem):
- 图书(book)
- 购买数量(num)
- 订单类(Order):
- 订单号(orderID)
- 订单总额(total)
- 订单项列表(items)
(2)由于购买图书时,需要选择图书的数量,所以需要在订单项类里定义获取图书对象以及图书数量的方法。
(3)由于需要指定订单项以及获取订单的订单列表、订单号、订单总额等信息,所以需要有订单列表、订单号、订单总额指定订单项等方法。
【案例实现】
定义图书类Book,其代码如下所示。
 1 	public class Book {
 2 	    private int id;    // 编号
 3 	    private String name;  // 书名
 4 	    private double price;  // 价格
 5 	    private int storage;   // 库存
 6 	    // 有参构造
 7 	    public Book(int id, String name, double price, int storage) {
 8 	        this.id = id;
 9 	        this.name = name;
 10 	        this.price = price;
 11 	        this.storage = storage;
 12 	    }
 13 	    // 获取书号
 14 	    public int getId() {
 15 	        return id;
 16 	    }
 17 	    // 获取书名
 18 	    public String getName() {
 19 	        return name;
 20 	    }
 21 	    // 获取价格
 22 	    public double getPrice() {
 23 	        return price;
 24 	    }
 25 	    // 获取库存
 26 	    public int getStorage() {
 27 	        return storage;
 28 	    }
 29 	}
上述代码中,声明了图书标号id、书名name、价格price、库存storage,并提供了其getter和setter方法。
定义订单项类OrderItem,其代码如下所示。
 1 	public class OrderItem {
 2 	    private Book book;
 3 	    private int num;
 4 	    // 有参构造方法
 5 	    public OrderItem(Book book, int num) {
 6 	        this.book = book;
 7 	        this.num = num;
 8 	    }
 9 	    // 获取图书对象
 10 	public Book getBook() {
 11 	      return book;
 12 	}
 13 	    // 获取订购图书数量
 14 	public int getNum() {
 15 	      return num;
 16 	    }
 17 	}
上述代码中,声明了图书对象Book,购买数量num,并提供了其getter和setter方法。
定义订单类Order,其代码如下所示。
 1 	public class Order {
 2 	    private String orderId;
 3 	    private OrderItem items[];
 4 	    private double total;
 5 	    // 有参构造
 6 	    public Order(String orderId) {
 7 	        this.orderId = orderId;
 8 	        this.items = new OrderItem[3];
 9 	    }
 10 	// 获取订单号
 11 	public String getOrderId() {
 12 	        return orderId;
 13 	}
 14 	// 获取订单列表
 15 	public OrderItem[] getItems() {
 16 	        return items;
 17 	}
 18 	// 获取订单总额
 19 	public double getTotal() {
 20 	        calTotal();
 21 	        return total;
 22 	}
 23 	// 指定一个订单项
 24 	public void setItem(OrderItem item, int i) {
 25 	        this.items[i] = item;
 26 	}
 27 	// 计算订单总额
 28 	public void calTotal() {
 29 	double total = 0;
 30 	for (int i = 0; i < items.length; i ++) {
 31 	      total += items[i].getNum() * items[i].getBook().getPrice();
 32 	}
 33 	      this.total = total;
 34 	}
 35 	}
上述代码中,声明了订单id、订单项数组,并声明了获取订单号方法getOrderId()、获取订单列表方法getItems()、获取订单总额方法getTotal()、指定一个订单项setItem()、计算订单总额的方法calTotal()。
 1 	import java.util.Scanner;
 2 	public class PayBooks {
 3 	    public static void main(String[] args) {
 4 	        Book books[] = new Book[3];
 5 	        //模拟从数据库中读取图书信息并输出
 6 	        outBooks(books);
 7 	        // 顾客购买图书
 8 	        Order order = purchase(books);
 9 	        // 输出订单信息
 10 	        outOrder(order);
 11 	    }
 12 	    // 顾客购买图书
 13 	    public static Order purchase(Book books[]) {
 14 	        Order order = new Order("00001");
 15 	        OrderItem item = null;
 16 	        Scanner in = new Scanner(System.in);
 17 	        for (int i = 0; i < 3; i ++) {
 18 	            System.out.println("请输入图书编号选择图书:");
 19 	            int cno = in.nextInt();
 20 	            System.out.println("请输入购买图书数量:");
 21 	            int pnum = in.nextInt();
 22 	            item = new OrderItem(books[cno-1],pnum);
 23 	            order.setItem(item, i);
 24 	            System.out.println("请继续购买图书。");
 25 	        }
 26 	        in.close();
 27 	        return order;
 28 	    }
 29 	    // 输出订单信息
 30 	    public static void outOrder(Order order) {
 31 	        System.out.println("\n\t图书订单");
 32 	        System.out.println("图书订单号:"+order.getOrderId());
 33 	        System.out.println("图书名称\t购买数量\t图书单价");
 34 	        System.out.println("--------------------------------------");
 35 	        OrderItem items[] = order.getItems();
 36 	        for(int i = 0; i < items.length; i ++) {
 37 	System.out.println(items[i].getBook().getName()+"\t"+items[i].getNum(
 38 	)+"\t"+items[i].getBook().getPrice());
 39 	            //System.out.println("\n");
 40 	        }
 41 	System.out.println("---------------------------------------");
 42 	 System.out.println("订单总额:\t\t"+order.getTotal());
 43 	}
 44 	    // 模拟从数据库中读取图书信息并输出
 45 	    public static void outBooks(Book books[]) {
 46 	        books[0] = new Book(1,"Java教程",30.6,30);
 47 	        books[1] = new Book(2,"JSP教程",42.1,40);
 48 	        books[2] = new Book(3,"SSH架构",47.3,15);
 49 	        System.out.println("\t图书列表");
 50 	        System.out.println("图书编号\t图书名称\t\t图书单价\t库存数量");
 51 	        System.out.println("---------------------------------------");
 52 	        for (int i = 0; i < books.length; i ++) {
 53 	            System.out.println(i+1+"\t"+books[i].getName()+"\t"+
 54 	                        books[i].getPrice()+"\t"+books[i].getStorage());
 55 	        }
 56 	        System.out.println("---------------------------------------");
 57 	    }
 58 	}
上述代码中,输出了图书列表信息包括:图书编号、图书名称、图书单价、库存数量,用户根据图书列表信息,输入图书编号、购买数量等,系统根据用户输入的图书编号及购买数量计算总金额。



















