Java 使用 OOP 的应用杂货店订购逻辑

Java application grocery ordering logic with OOP

我正在做一个杂货订购系统,但在订购逻辑方面遇到了问题。

目前,该程序会询问客户他们想要订购多少杂货,但我发现这是一种订购方式,无需在开始时指定要订购的数量。

有人知道吗?谢谢。

下面是驱动classShop.java

package groceries.ordering.system;


import java.util.*;


public class Shop {
    
    public static void main(String[] args){
        
        Scanner myScanner = new Scanner(System.in);
      
        Category[] groceries = {new Category("Apple 1pcs", 1.5, "Fruit"),
                                new Category("Orange 1pcs", 1.4, "Fruit"),
                                new Category("Egg 10pcs", 8, "Dairy"),
                                new Category("Full Cream Milk", 6.5, "Dairy"),
                                new Category("Olive Oil 1L", 30, "Cooking Oil"),
                                new Category("Palm Oil 1L", 20, "Cooking Oil")};
                            
                   
        displayMenu(groceries);

        System.out.print("How many groceries you would like to order: ");
        int totalGroceries = myScanner.nextInt();
        
        OrderItem[] items = new OrderItem[totalGroceries];
        
        for(int i=0;i<items.length;i++){
        System.out.println("Enter your choice of groceries (1 - 6) : ");
        int choice = myScanner.nextInt()-1;
        System.out.println("Enter quantity ordered: ");
        int quantity = myScanner.nextInt();
        
        items[i] = new OrderItem(groceries[choice],quantity);
      }
        
        Order order = new Order(items,totalGroceries);
          displayOrderItem(items);
          System.out.printf("%65s %9.2f\n", "Grand Total: ", order.getGrandTotalPrice());

    } 

     public static void displayMenu(Groceries[] groceries){
        
        System.out.printf("\t========================================\n");
        System.out.printf("\tWelcome to the Groceries Ordering System\n");
        System.out.printf("\t========================================\n");
        System.out.printf("%-10s %-25s %-11s %s \n\n", "No", "Groceries", "Price(RM)", "Category");
        for(Groceries grocery : groceries){
            System.out.println(grocery.displayMenu());
            
        }
        System.out.println("\n");
    }
     
     public static void displayOrderItem(OrderItem[] items){
        System.out.printf("\n\t\t\t\t Ordered Item\n");
        System.out.printf("\t\t\t\t===============\n");
        System.out.printf("%-10s %-20s %-14s %-13s %-13s\n", "No","Groceries", "Price(RM)","Quantity","Total Price(RM)");
        System.out.printf("--------------------------------------------------------------------------------------\n");
        for(OrderItem item : items){
            System.out.println(item.displayOrder());
        }
        System.out.printf("--------------------------------------------------------------------------------------\n");
    }     
       
}

这是杂货店 class(不会发布此 class 的子class(类别),因为我认为没有任何相关)

package groceries.ordering.system;


public abstract class Groceries {
    
    private String name;
    private double price;

    public Groceries() {
        this("",0);
    }
    
    public Groceries(String prodName, double prodPrice){
        super();
        name = prodName;
        price = prodPrice;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public String displayMenu(){
        return String.format("%-25s %-11.2f ", name,price);
    }


}

这是订单项class

public class OrderItem {
    
    private Groceries groceries;
    private int quantity;
    private static int prodCount = 1;
    
    public OrderItem(Groceries groceries, int quantity) {
        this.groceries = groceries;
        this.quantity = quantity;
    }
    
    public double getUnitPrice(){
     return groceries.getPrice();
        
    }
    
    public double getSubTotalPrice(){
        return getUnitPrice() * quantity;
    }
    

    public String displayOrder() {
        return String.format("%-10d %-20s %9.2f %13d %19.2f",prodCount++, groceries.getName(),
                              getUnitPrice(),quantity,getSubTotalPrice());
    }
}

最后是订单 class

public class Order {
    
    private OrderItem[] items;
    private int totalItem;

    
    public Order(OrderItem[] items, int totalItem) {
        this.items = items;
        this.totalItem = totalItem;
    }

    
    public double getGrandTotalPrice() {
        double price = 0.0;
        for (OrderItem item : items) {
            price += item.getSubTotalPrice();
        }
        return price;
    }
       
}

当然可以。您可以通过两种方式完成。

  1. 事先创建一个非常大的数组(不推荐)。
  2. 使用一些 ListArrayListLinkedList 或其他)并继续添加项目,直到用户完成。

List<OrderItem> items = new ArrayList<>();
    
do {
    System.out.println("Enter your choice of groceries (1 - 6) : ");
    int choice = myScanner.nextInt()-1;
    System.out.println("Enter quantity ordered: ");
    int quantity = myScanner.nextInt();
    
    items.add(new OrderItem(groceries[choice],quantity));

    // compute shouldContinue - something like asking the user to enter -1 to quit.
} while(shouldContinue);
   
  

是的,在数组下方使用列表实现 ArrayListLinkedList 并使用其功能:

替换这个 - OrderItem[] items = new OrderItem[totalGroceries];

与 ArrayList- List<OrderItem> items = new ArrayList<>();

如果您想 运行 在多线程环境中使用此应用程序,您也可以使用 CopyOnWriteArrayList