精华内容
下载资源
问答
  • 请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能: 1.正常餐品结算和找零。 2.基本套餐结算和找零。 3.使用优惠劵购买餐品结算...

    一. 题目分析及要求

    同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:
    1.正常餐品结算和找零。
    2.基本套餐结算和找零。
    3.使用优惠劵购买餐品结算和找零。
    4.模拟打印小票的功能(写到文件中)。
    基本要求:
    1.实现功能测试代码,确保程序的健壮性。
    2.画出使用的设计模式图。

    二. 设计模式

    单点食物
    采用简单工厂模式,利用Java反射机制来实现食品类的实例化。
    工厂类名 : ( SimFoodFactory )

    套餐产品
    采用抽象工厂模式,实现套餐系列产品的生成(三个)
    工厂类名:(ComboOneFactory, ComboSecondFactory ,ComboThirdFactory )

    三. 类图设计

    在这里插入图片描述

    四. 算法实现

    1.实体类 Food

    public class Food {
        public Integer id;
        public String name;
        public Double price;
    
        public Integer getId(){
            return id;
    
        }
        public String getName(){
            return name;
        }
    
        public Double getPrice(){
            return price;
        }
    
    }
    

    2.Drink 类,Eat 类 继承 Food基类

    public class Eat extends Food {
        public Float quality;
    
        public Float getQuality(){
            return quality;
        }
            @Override
                    public String toString(){
                return "Eat{"+
                        "quality=" +quality+
                        ", id="+ id +
                        ", name='"+name +'\''+
                        ", price="+price+
            '}'  ;
    
    
    }}
    3.单种食物,单种饮料分别继承Eat 及 Drink
    如:①食物单品
    public class ChipsItem extends Eat {
        public ChipsItem() {
            this.id=1006;
            this.name="波纹霸王薯条";
            this.price=12.0;
            this.quality=50f;
    
        }
    }
    
     ②饮料单品
    public class BeerItem extends Drink {
        public BeerItem(){
            this.id = 1004;
            this.name = "百威啤酒";
            this.price= 15.0;
            this.capacity= 120f;
        }
    }
    

    4.简单工厂,通过反射机制加载食物类实例(单点)

    import kfc.order.item.Food;
    
    /**
     *
     * 简单工厂,反射加载食物类实例(单点食物)
     */
    
    public class SimFoodFactory {
        public Food getFood(Class c){
            try{
                return (Food) Class.forName(c.getName()).newInstance();
            }catch (InstantiationException | IllegalAccessException| ClassNotFoundException e){
                e.printStackTrace();
            }
            return null;
        }
    
    
    }
    

    5.套餐组合通过CombFactory 接口的实现来加载

    mport kfc.order.item.Food;
    
    import java.util.List;
    
    /**
     * 抽象工厂,加载KFC组合套餐
     */
    public interface CombFactory {
        List<Food> getCombo();
    }
    
    
    
    具体一号套餐
    import kfc.order.item.BeerItem;
    import kfc.order.item.ChickenItem;
    import kfc.order.item.Food;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 啤酒炸鸡 (1)号套餐
     */
    public class ComboOneFactory implements CombFactory{
    @Override
    public List<Food> getCombo(){
            List<Food> foodOneList= new ArrayList<Food>();//存储套餐产品
            Food chick=new ChickenItem();//实例化套餐内的产品
            Food beer =new BeerItem();
            chick.price=chick.price-2;//套餐的优惠,炸鸡价格减2元
            beer.price=beer.price-1;//套餐的优惠,啤酒价格减1元
            foodOneList.add(chick);
            foodOneList.add(beer);
            return foodOneList;//返回套餐集合
    
            }
    }
    

    6.FoodControler 类 通过函数处理具体点餐事务

    import kfc.order.item.*;
    import kfc.order.service.ComboOneFactory;
    import kfc.order.service.ComboSecondFactory;
    import kfc.order.service.ComboThirdFactory;
    import kfc.order.service.SimFoodFactory;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    
    public class FoodControler {
         static SimFoodFactory simFoodFactory = new SimFoodFactory();//简单工厂实例化
         static List<Food> foodList = new ArrayList<>();
    
        public  void service(){
            Scanner sc = new Scanner(System.in);
    
            String choose = sc.nextLine();
            switch (choose){
                case "7":
                    foodList = new ComboOneFactory().getCombo();//抽象工厂产生套餐1
                    break;
                case "8":
                    foodList = new ComboSecondFactory().getCombo();//抽象工厂产生套餐2
                    break;
                case "9":
                    foodList = new ComboThirdFactory().getCombo();//抽象工厂产生套餐3
                    break;
                case"1":
                //香辣炸鸡
                   Food food_1= simFoodFactory.getFood(ChickenItem.class);//反射加载单品食物
                    foodList.add(food_1);
                    break;
                case"2":
                    //香辣鸡腿堡
                   Food food_2 = simFoodFactory.getFood(HamburgerItem.class);
                    foodList.add(food_2);
                    break;
                case"3":
                    //薯条
                   Food food_3 = simFoodFactory.getFood(ChipsItem.class);
                    foodList.add(food_3);
                    break;
                case"4":
                    //美式
                    Food food_4 = simFoodFactory.getFood(CafeItem.class);
                    foodList.add(food_4);
                    break;
                case"5":
                    //可乐
                   Food food_5 = simFoodFactory.getFood(CokeItem.class);
                    foodList.add(food_5);
                    break;
                case"6":
                    //百威啤酒
                   Food  food_6 = simFoodFactory.getFood(BeerItem.class);
                    foodList.add(food_6);
                    break;
    
    
              default:
                  System.out.println("您所输入的点餐序号不存在");
                  foodList = new ArrayList();
            }
    
    }}
    

    7.MainApp 类处理结算及顾客选择

    其功能实现为其他类实例化对象当做方法参数使用
    

    五. 测试截图

    点餐界面截图

    在这里插入图片描述

    小票截图

    在这里插入图片描述

    六. 个人总结

    Java Swing 可视化还未能掌握,因此此次程序设计只完成了基本要求。在程序编写中,对Java面向对象的思想有了更深的理解,也提升了编程中解决问题的能力。
    在食物的实例化过程中,对建造者设计模式有了进一步的认识。同时对Java的反射机制有了一定的理解。

    附 : 源码

    package kfc.order.item;
    
    public class Food {
        public Integer id;
        public String name;
        public Double price;
    
        public Integer getId(){
            return id;
    
        }
        public String getName(){
            return name;
        }
    
        public Double getPrice(){
            return price;
        }
    
    }
    
    
    package kfc.order.item;
    
    public class Eat extends Food {
        public Float quality;
    
        public Float getQuality(){
            return quality;
        }
            @Override
                    public String toString(){
                return "Eat{"+
                        "quality=" +quality+
                        ", id="+ id +
                        ", name='"+name +'\''+
                        ", price="+price+
            '}'  ;
    
    
        }
    }
    
    
    package kfc.order.item;
    
    public class Drink  extends Food{
        public Float capacity;
    
        public Float getCapacity(){
            return capacity;
    
        }
        @Override
        public String toString(){
            return "Drink{"+
                    "capacity=" +capacity+
                    ", id="+ id +
                    ", name='"+name +'\''+
                    ", price="+price+
                    '}';
    
        }
    }
    
    
    package kfc.order.item;
    
    public class HamburgerItem  extends Eat {
        public HamburgerItem(){
            this.id = 1001;
            this.name = "香辣大虾堡";
            this.price = 22.0;
            this.quality = 10f;
        }
    }
    
    
    package kfc.order.item;
    
    public class CokeItem extends Drink {
        public CokeItem(){
            this.id = 1003;
            this.name ="可口可乐";
            this.price = 11.0;
            this.capacity = 200f;
    
        }
    
    }
    
    
    package kfc.order.item;
    
    public class ChipsItem extends Eat {
        public ChipsItem() {
            this.id=1006;
            this.name="波纹霸王薯条";
            this.price=12.0;
            this.quality=50f;
    
        }
    }
    
    
    package kfc.order.item;
    
    public class ChickenItem extends Eat{
        public ChickenItem(){
            this.id = 1002;
            this.name = "香辣鸡翅";
            this.price = 48.0;
            this.quality = 100f;
    
        }
    
    }
    
    
    package kfc.order.item;
    
    public class CafeItem extends Drink {
         public CafeItem(){
             this.id = 1005;
             this.name ="美式咖啡";
             this.price = 17.0;
             this.capacity =100f;
         }
    }
    
    
    package kfc.order.item;
    
    public class BeerItem extends Drink {
        public BeerItem(){
            this.id = 1004;
            this.name = "百威啤酒";
            this.price= 15.0;
            this.capacity= 120f;
        }
    }
    
    
    package kfc.order.service;
    
    import kfc.order.item.Food;
    
    import java.util.List;
    
    /**
     * 抽象工厂,加载KFC组合套餐
     */
    public interface CombFactory {
        List<Food> getCombo();
    }
    
    
    package kfc.order.service;
    
    import kfc.order.item.BeerItem;
    import kfc.order.item.ChickenItem;
    import kfc.order.item.Food;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 啤酒炸鸡 (1)号套餐
     */
    public class ComboOneFactory implements CombFactory{
    @Override
    public List<Food> getCombo(){
            List<Food> foodOneList= new ArrayList<Food>();//存储套餐产品
            Food chick=new ChickenItem();//实例化套餐内的产品
            Food beer =new BeerItem();
            chick.price=chick.price-2;//套餐的优惠,炸鸡价格减2元
            beer.price=beer.price-1;//套餐的优惠,啤酒价格减1元
            foodOneList.add(chick);
            foodOneList.add(beer);
            return foodOneList;//返回套餐集合
    
            }
    }
    
    
    package kfc.order.service;
    
    import kfc.order.item.CafeItem;
    import kfc.order.item.Food;
    import kfc.order.item.HamburgerItem;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 咖啡和汉堡 (2)号套餐
     */
    
    public class ComboSecondFactory implements CombFactory {
        public List<Food> getCombo(){
            List<Food> foodSecondList= new ArrayList<Food>();
            Food ham = new HamburgerItem();
            Food  cafe= new CafeItem();
            ham.price = ham.price-1;//套餐组合的优惠 汉堡减一元
            cafe.price = cafe.price-0.5;//套餐组合的优惠 咖啡减0.5元
            foodSecondList.add(cafe);
            foodSecondList.add(ham);
            return foodSecondList;
    
        }
    }
    
    
    package kfc.order.service;
    
    import kfc.order.item.ChipsItem;
    import kfc.order.item.CokeItem;
    import kfc.order.item.Food;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 可乐和薯条 (3)号套餐
     */
    public class ComboThirdFactory implements CombFactory {
        @Override
        public List<Food> getCombo() {
            List<Food> foodThreeList = new ArrayList<Food>();
            Food chips = new ChipsItem();
            Food cola = new CokeItem();
            cola.price = cola.price - 1;//套餐组合的优惠
            chips.price = chips.price - 0.5;
            foodThreeList.add(chips);
            foodThreeList.add(cola);
            return foodThreeList;
        }
    }
    
    
    package kfc.order.service;
    
    import kfc.order.item.Food;
    
    /**
     *
     * 简单工厂,反射加载食物类实例(单点食物)
     */
    
    public class SimFoodFactory {
        public Food getFood(Class c){
            try{
                return (Food) Class.forName(c.getName()).newInstance();
            }catch (InstantiationException | IllegalAccessException| ClassNotFoundException e){
                e.printStackTrace();
            }
            return null;
        }
    
    
    }
    
    
    package kfc.order.control;
    
    import kfc.order.item.*;
    import kfc.order.service.ComboOneFactory;
    import kfc.order.service.ComboSecondFactory;
    import kfc.order.service.ComboThirdFactory;
    import kfc.order.service.SimFoodFactory;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    
    public class FoodControler {
         static SimFoodFactory simFoodFactory = new SimFoodFactory();//简单工厂实例化
         static List<Food> foodList = new ArrayList<>();
    
        public  void service(){
            Scanner sc = new Scanner(System.in);
    
            String choose = sc.nextLine();
            switch (choose){
                case "7":
                    foodList = new ComboOneFactory().getCombo();//抽象工厂产生套餐1
                    break;
                case "8":
                    foodList = new ComboSecondFactory().getCombo();//抽象工厂产生套餐2
                    break;
                case "9":
                    foodList = new ComboThirdFactory().getCombo();//抽象工厂产生套餐3
                    break;
                case"1":
                //香辣炸鸡
                   Food food_1= simFoodFactory.getFood(ChickenItem.class);
                    foodList.add(food_1);
                    break;
                case"2":
                    //香辣鸡腿堡
                   Food food_2 = simFoodFactory.getFood(HamburgerItem.class);
                    foodList.add(food_2);
                    break;
                case"3":
                    //薯条
                   Food food_3 = simFoodFactory.getFood(ChipsItem.class);
                    foodList.add(food_3);
                    break;
                case"4":
                    //美式
                    Food food_4 = simFoodFactory.getFood(CafeItem.class);
                    foodList.add(food_4);
                    break;
                case"5":
                    //可乐
                   Food food_5 = simFoodFactory.getFood(CokeItem.class);
                    foodList.add(food_5);
                    break;
                case"6":
                    //百威啤酒
                   Food  food_6 = simFoodFactory.getFood(BeerItem.class);
                    foodList.add(food_6);
                    break;
    
    
              default:
                  System.out.println("您所输入的点餐序号不存在");
                  foodList = new ArrayList();
            }
    
    
    
    }}
    
    
    package kfc.order.control;
    
    import kfc.order.item.Food;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Date;
    import java.util.List;
    
    
    public class  MoneyAnalyze {
        public   Double getMoneyCount(List<Food> list ){//,Double disCount,Double tickets){
            Double moneyCount = 0.0; //顾客应付钱数
            for (Food food:list){
                moneyCount += food.price;
    
            }//return moneyCount*disCount-tickets;  //计算折扣后应付钱数
            return moneyCount;
        }
    
        /**
         * 找零
         * @param inMoney 收入的钱数
         * @param  count 应收钱数
         */
        public  Double getChange( Double inMoney,Double count){
            return inMoney-count;
        }
        /**
         * 打印小票
         *
         */
        public  void receipt(List<Food>list ,Double disCount,Double tickets) throws IOException{
    
              Date currentTime = new Date();
    
              FileWriter fileWriter= new FileWriter("receipt.txt");
              BufferedWriter bw = new BufferedWriter(fileWriter);
              bw.write("————————————————————欢迎光临  **有点LOW**  KFC————————————————"+"\r\n");
              bw.write("\n\n");
              bw.write("订单时间:"+currentTime+"\r\n\n");
              bw.write("您本次消费清单如下"+"\r\n");
              for (Food food:list){
                  bw.write("ID:"+food.id+"\r\n");
                  bw.write("食物:"+food.name+"\r\n");
                  bw.write("金额:"+food.price+"\r\n");
              }
              bw.write("折扣"+disCount*10 +"折"+"\r\n");
              bw.write("优惠"+tickets+"元"+"\r\n");
              bw.write("总金额"+((getMoneyCount(list)*disCount)-tickets)+ "\u5143");
              bw.flush();
              bw.close();
    
        }
    
    
    }
    
    
    package kfc.order.control;
    
    import java.io.IOException;
    import java.util.Scanner;
    
    public class MainApp {
        public static  Double tickets=0.0 ;
        public static Double disCount=1.0;
        MoneyAnalyze moneyAnalyze = new MoneyAnalyze();
        static FoodControler foodControler = new FoodControler();
    
    
        public void interFace()throws IOException{
            System.out.println("============================================================");
            System.out.println("************************************************************\n");
            System.out.println("--------------------欢迎光临KFC------------------------------");
            System.out.println("**************     1.点餐                                    \n");
            System.out.println("**************     2.领取优惠卷 (请在购买商品之后查看领取哦)   \n");
            System.out.println("**************     3.结算                                    \n");
            System.out.println("*************************************************************\n");
            System.out.println("=============================================================");
            System.out.println("请选择服务类型:");
            chooseServe();
        }
        public void chooseServe() throws IOException {
            Scanner sc = new Scanner(System.in);
            String inter =sc.nextLine();
            while (true){
            if(inter.equals("1")){
                orderMeal();
    
                break;
            }
            else if(inter.equals("2")){
                System.out.println("满50减3.6元");
                System.out.println("满80减5.0元");
                System.out.println("请选择服务类型:");
                chooseServe();
                break;
            }
            else if(inter.equals("3")){
                if(foodControler.foodList!=null){
                settlement();
                break;}
                else {
                    System.out.println("您当前还未点餐,结算系统锁定,请点餐后选择");
                    chooseServe();
                }
            }else {
                System.out.println("服务类型不存在,我们正在完善中,请您重新选择 ");
                chooseServe();
                break;
            }}
        }
        public void orderMeal() throws IOException {
            System.out.println("\n");
            System.out.println("----------------  本店推出以下菜品:--------------------------");
            System.out.println("①  自选单品");
            System.out.println("1. 香辣鸡翅:48元/份             2. 香辣大虾堡:22元/个");
            System.out.println("3. 波纹霸王薯条: 12元/份        4. 美式咖啡:17元/杯  ");
            System.out.println("5. 可口可乐:11元/杯             6. 百威啤酒:15元/杯    " );
            System.out.println("②  人气套餐——有优惠哦");
            System.out.println("7. 套餐一:啤酒+炸鸡:60元/份");
            System.out.println("8. 套餐二:汉堡+咖啡:37.5元/份");
            System.out.println("9. 套餐三:可乐+薯条:21.5元/份");
            System.out.println("--------------------------------------------------------------");
            System.out.println("请选择餐品序号");
    
    //调用FoodControler 函数Server()
    // FoodControler foodControler =new FoodControler();
            while(true){
    
                foodControler.service();
    
                System.out.println("您所点的商品如下 :");
                System.out.println(foodControler.foodList);
                System.out.println("您当前订单金额为:"+moneyAnalyze.getMoneyCount(foodControler.foodList)+"元");
    //            System.out.println(foodControler.foodList.isEmpty());//测试列表空否
                chooseQuit();
                break;
    
    
            }
    
        }
        public void chooseQuit() throws IOException {//点餐界面离开选项
            System.out.println("继续:【Y】  结算:【S】  返回【A】");
            System.out.println("请输入服务类型:");
            Scanner sc = new Scanner(System.in);
            String item =sc.nextLine();
            while (true) {
                if (item.equals("A") || item.equals("a")) {
                    interFace();
                    break;
                } else if (item.equals("Y") || item.equals("y")) {
    
                    System.out.println(foodControler.foodList);
    //                System.out.println("您当前订单金额为:"+moneyAnalyze.getMoneyCount(foodControler.foodList));
    
                    orderMeal();
                    break;
                } else if (item.equals("S") || item.equals("s")) {
                    settlement();
                    break;
    
    
                } else {
                    System.out.println("您所选择的服务不存在,请重新输入:");
                    chooseQuit();
                    break;
                }
            }
        }
        public void getTickets(){
    
            if(moneyAnalyze.getMoneyCount(foodControler.foodList)<50){
                System.out.println("您的订单无法领取优惠券");
            }
            if(moneyAnalyze.getMoneyCount(foodControler.foodList)>50&&moneyAnalyze.getMoneyCount(foodControler.foodList)<80){
                tickets=3.6;
                System.out.println("您的订单可以领取3.6元优惠券");
            }else if(moneyAnalyze.getMoneyCount(foodControler.foodList)>80){
                tickets=5.0;
                System.out.println("您的订单可以领取5元优惠券");
            }
    
        }
    
        /**
         * 通过消费判定折扣
         */
        public void settlement() throws IOException {
    
            System.out.println("您的付款金额:");
            Scanner sc = new Scanner(System.in);
            Double inMoney = sc.nextDouble();
    
            if(moneyAnalyze.getMoneyCount(foodControler.foodList)>50){
                //tickets= 3.6;
                disCount=0.86;
            }else if(moneyAnalyze.getMoneyCount(foodControler.foodList)>80){
                //tickets=5;
                disCount=0.75;
            }
    
            System.out.println("您本次消费如下:");
            getTickets();
            System.out.println("您本次消费:"+moneyAnalyze.getMoneyCount(foodControler.foodList));
    
            System.out.println("优惠:"+tickets+" 元");
            System.out.println("折扣:"+disCount*10+" 折");
            System.out.println("折后消费:"+(moneyAnalyze.getMoneyCount(foodControler.foodList)*disCount));
            System.out.println("收您:"+inMoney+" 元");
    
            System.out.println("找零:"+(moneyAnalyze.getChange(inMoney,moneyAnalyze.getMoneyCount(foodControler.foodList)*disCount-tickets))+" 元");
    
            moneyAnalyze.receipt(foodControler.foodList,disCount,tickets);//调用函数打印小票
    
        }
    
    
    
    }
    
    
    package kfc.order.control;
    import java.io.IOException;
    
    
    
    public class StartKFC  {
    
        public static void main(String[] args) throws IOException {
            MainApp mainApp = new MainApp();
    
            mainApp.interFace();
    
    
    
    
        }
    }
    //工厂模式算法源自CSDN 博客
    
    
    展开全文
  • 基于javaweb的在线点餐系统-线上点餐系统代码java 注意:该项目只展示部分功能,如需了解,评论区咨询即可。 1.开发环境 开发语言:Java 技术:Servlet+JSP+HTML+CSS+JavaScript 数据库:MySQL 架构:B/S 源码...

    基于javaweb的在线点餐系统-线上点餐系统代码java

    注意:该项目只展示部分功能,如需了解,评论区咨询即可。

    1.开发环境

    • 开发语言:Java
    • 技术:Servlet+JSP+HTML+CSS+JavaScript
    • 数据库:MySQL
    • 架构:B/S
    • 源码类型: Web
    • 编译工具:Idea、Eclipse、MyEclipse (选其一)
    • 其他:jdk1.8、Tomcat8.0

    2.系统的设计与实现

    2.1 用户类型

    用户角色分为 管理员、用户 这两类用户。

    2.2 各角色功能模块

    2.2.1 管理员

    • 登录;
    • 修改密码;
    • 用户管理;
    • 菜品类别管理;
    • 菜品信息管理;
    • 订单信息管理;
    • 留言信息管理。

    2.2.2 用户

    • 注册;
    • 登录;
    • 查看菜品;
    • 添加购物车;
    • 点餐;
    • 结算;
    • 填写收货信息;
    • 留言。

    2.3 部分功能模块展示

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    源码项目、定制开发、代码讲解、答辩辅导
    希望和大家多多交流!!

    展开全文
  • 在线点餐的网页版,用户能实现从选餐与商家之间实现点外卖.用到的技术为java web,前台界面jQuery,及各种热门的前台插件,该项目并没有用到java的高级框架.资源里数据库,源码,开发基本流程及前台界面的模板.项目可直接...
  • java实现kfc点餐系统

    2019-05-17 20:55:28
    1. 正常餐品结算和找零。 2. 基本套餐结算和找零。 3. 使用优惠劵购买餐品结算和找零。 4. 可在一定时间段参与店内活动(自行设计或参考官网信息)。 5. 模拟打印小票的功能(写到文件中)。 基本要求: 1. 程序设计...

    一、题目分析
    1.1、题目要求

    1. 正常餐品结算和找零。
    2. 基本套餐结算和找零。
    3. 使用优惠劵购买餐品结算和找零。
    4. 可在一定时间段参与店内活动(自行设计或参考官网信息)。
    5. 模拟打印小票的功能(写到文件中)。
      基本要求:
    6. 程序设计风格良好,控制台界面友好,最多两人一组完成任务。
    7. 实现功能测试代码,确保程序的健壮性。
    8. 画出使用的设计模式图。
      1.2、算法实现
      1.2.1、使用抽象工厂方法产生食物
      肯德基生产食物,通过抽象方法工厂建立肯德基工厂,建立抽象食物类设置属性,建立食物接口,所有食物类的基类继承抽象食物基类,实现食物接口。
      建立抽象工厂,包含各个食物的创建方法。具体的工厂是这个接口的子类,重写工厂的方法,创建具体食物对象。专门建立一个工厂类用来调用具体工厂中的产生具体食物对象的方法,通过反射,从客户端得知他们需要什么食物,从而生产什么食物。
      1.2.2、使用策略模式实现结算功能
      当付钱的时候可以根据策略的不同选择不同的付钱方式,可以选择支付宝,微信,零钱付款,各个付款方式优惠方式不同,这个可以通过策略模式实现。

    二、关键算法构造
    2.1、文档注释
    2.1.1、食物基类

    /**
     * 食物基类
     */
    abstract class BaseFood {
        /**
         * 类别
         */
        String name;
        /**
         * 数量
         */
        int num;
        /**
         * 价格
         */
        float price;
    
        /**
         * 合计
         * @return 食物总价格
         */
        public float totalPrice() {
            return this.num * this.price;
        }
    }
    

    2.1.2、抽象食物接口

    /**
     * 抽象食物接口
     */
    interface IFood {
        /**
         * 打印输出食物信息
         */
        void printMessage();
    
    }
    

    2.1.3、抽象肯德基工厂

    /**
     * 建立工厂
     * 创建抽象肯德基工厂
     * 生产抽象食物
     */
    interface IKfcFactory {
        /**
         * 生产帕尼尼
         * @param num 要买的数量
         * @return BaseHamburg对象
         */
        BaseHamburg createPaNiNiHamburg(int num);
        /**
         * 生产劲脆鸡腿堡
         * @param num 要买的数量
         * @return BaseHamburg对象
         */
        BaseHamburg createCrispyChickenHamburg(int num);
        /**
         * 生产巧克力华夫
         * @param num 要买的数量
         * @return BaseFrenchFries对象
         */
        BaseSweetmeats createChocolateWaffleSweetmeats(int num);
        /**
         *  生产生产香香红豆派
         * @param num
         * @return
         */
        BaseSweetmeats createRedBeanPieSweetmeats(int num);
        /**
         * 生产热辣薯片鸡翅
         * @param num 要买的数量
         * @return BaseChicken对象
         */
        BaseChicken createHotPotatoChipsChickenWings(int num);
    
        /**
         *  生产劲爆香辣鸡翅
         * @param num 要买的数量
         * @return BaseChicken对象
         */
        BaseChicken createPiquancyChickenWings(int num);
        /**
         * 生产百事可乐
         * @param num 要买的数量
         * @return BaseBeverage对象
         */
        BaseBeverage createBaiShiKolaBeverage(int num);
    
        /**
         * 生产咖啡
         * @param num 要买的数量
         * @return BaseBeverage对象
         */
        BaseBeverage createCoffeeBeverage(int num);
    
        /**
         * 生产翅桶嫩牛五方套餐
         * @param num 要买的数量
         * @return BaseSetMeal对象
         */
        BaseSetMeal createWingBucketTenderFiveSides(int num);
    
        /**
         * 生产辣鸭肉卷人气明星套餐
         * @param num 要买的数量
         * @return BaseSetMeal对象
         */
        BaseSetMeal createSpicyDuckRollPopularStarMealBase(int num);
    }
    

    2.2、类图设计
    kfc抽象工厂设计模式类图(图片分辨率较高,请放大查看),如果实在看不清,请查看下面链接source文件夹下的图片
    在这里插入图片描述
    三、程序实现
    参考以下文件
    链接

    四、调试、测试及运行结果
    4.1调试截图
    菜单显示
    在这里插入图片描述
    当选择1号餐数量为2时
    在这里插入图片描述
    food为抽象出来的工厂通过餐品选择调用相应的创建创建方法
    shouldPayMoney为应该付的钱
    在这里插入图片描述
    继续选择食物5号食物数量6个

    在这里插入图片描述

    baseFood为ArrayList数组用来存放选择的餐品,刚才选了芝士帕尼尼和百事可乐,所以存储的是相应的食物
    在这里插入图片描述
    输入界面
    在这里插入图片描述
    cutDown为优惠券的价格
    giveMoney为客户给的钱
    change为找零
    shouldPayMoney为应该付的钱
    在这里插入图片描述
    选择支付宝支付有5元的红包,找零界面
    在这里插入图片描述
    4.2测试截图
    点餐根据菜单点餐,提供友好的输入检查,知道输入正确为止
    在这里插入图片描述
    选择数量检查,直到输入正确为止
    -
    输入优惠券界面,进行输入检查
    在这里插入图片描述

    选择支付方式,选择微信支付,享受95折优惠
    在这里插入图片描述
    打印小票
    在这里插入图片描述

    五、经验归纳
    第一次接触抽象工厂模式,通过反射的方式获得真正的实例化对象。只会一种方式:专门设计一个类用来实例化其他类的对象,其他类往往有公共的父类,即Food接口,这样使用反射的机制就很好实现,直接通过参数就能够实例化相应的对象。一开始只知道通过接口实现公共的父类,但真正的做的时候,发现每一个食物都有相同的属性要设置,所以要设计一个公共的抽象父类来实现,这样才能赋予每一个子类相关属性。
    同时熟练掌握了处理多个食物产品蔟的构建方法,深深感受到了抽象工厂方法模式的优点,和抽象工厂方法比较一下抽象工厂模式进一步扩展了工厂方法模式,它把原先的工厂方法模式中只能有一个抽象产品不能添加产品族的缺点克服了,抽象工厂模式不仅仅遵循了OCP原则,而且可以添加更多产品(抽象产品),具体工厂也不仅仅可以生成单一产品,而是生成一组产品,抽象工厂也是声明一组产品,对应扩展更加灵活,但是要是扩展族系就会很笨重。 所以就选择了抽象工厂模式。
    在付钱的时候,使用了策略模式,通过不同的策略选择不同的付款方式,使用策略模式支持开闭原则(OCP)、策略模式使用继承模式抽取公共代码到基类,避免重复代码、策略模式避免使用多重条件判断语句 (if/else、switch 等)。方便了对付款方式的选择。
    遗憾的是没有实现提高要求的可视化功能和数据库存储,但是后期学习一定将程序完善。

    展开全文
  • } } } 前端代码 链接: jquery仿外卖点餐购物车页面代码. 下载下来,代码覆盖index.html和add.js文件即可 <html> <head> <meta charset="utf-8"> , initial-scale=1.0, user-scalable=no"/> 商品title> ...

    服务端代码 端口默认8080

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.socket.server.standard.ServerEndpointExporter;
    
    /**
     * WebSocket配置
     */
    @Configuration
    public class WebSocketConfig {
    
        @Bean
        public ServerEndpointExporter serverEndpointExporter () {
            return new ServerEndpointExporter();
        }
    
    }
    
    import org.springframework.stereotype.Component;
    
    import javax.websocket.*;
    import javax.websocket.server.ServerEndpoint;
    import java.io.IOException;
    import java.util.concurrent.CopyOnWriteArraySet;
    import java.util.concurrent.atomic.AtomicInteger;
    
    
    @Component
    @ServerEndpoint(value = "/ws")
    public class WebSocketServer {
    
        //与某个客户端的连接会话,需要通过它来给客户端发送数据
        private Session session;
    
        private static final AtomicInteger OnlineCount = new AtomicInteger(0);
    
        private static CopyOnWriteArraySet<Session> SessionSet = new CopyOnWriteArraySet<>();
    
        /**
         * 连接建立成功调用的方法
         */
        @OnOpen
        public void onOpen(Session session) {
            SessionSet.add(session);
            this.session = session;
            int cnt = OnlineCount.incrementAndGet(); // 在线数加1
            System.out.println("有连接加入,当前连接数为:" + cnt);
        }
    
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose() {
            SessionSet.remove(this.session);
            int cnt = OnlineCount.decrementAndGet();
            System.out.println("有连接关闭,当前连接数为:" + cnt);
        }
    
        /**
         * 收到客户端消息后调用的方法
         * @param message 客户端发送过来的消息
         */
        @OnMessage
        public void onMessage(String message, Session session) {
            System.out.println(message);
            BroadCastInfo(message);
        }
    
        /**
         * 出现错误
         * @param error
         */
        @OnError
        public void onError(Throwable error) {
            error.printStackTrace();
        }
    
    
        /**
         * 发送消息
         *
         * @param session
         * @param message
         */
        public static void SendMessage(Session session, String message) {
            try {
                if (session.isOpen()) {
                    session.getBasicRemote().sendText(message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 群发消息
         *
         * @param message
         * @throws IOException
         */
        public static void BroadCastInfo(String message) {
            for (Session session : SessionSet) {
                SendMessage(session, message);
            }
        }
    
        /**
         * 指定Session发送消息
         *
         * @param sessionId
         * @param message
         * @throws IOException
         */
        public static void SendMessage(String message, String sessionId) {
            Session session = null;
            for (Session s : SessionSet) {
                if (s.getId().equals(sessionId)) {
                    session = s;
                    break;
                }
            }
            if (session != null) {
                SendMessage(session, message);
            }
        }
    
    }
    

    前端代码

    链接: jquery仿外卖点餐购物车页面代码.
    下载下来,代码覆盖index.html和add.js文件即可

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"/>
    <title>商品</title>
    <link rel="stylesheet" type="text/css" href="css/aui.css">
    <link rel="stylesheet" href="css/classify.css">
    <style>
    	html,body{height: 100%;max-width: 640px;margin:0 auto;}
    	.aui-bar-nav{border:none;background: #f5f5f5;}
    	.main{height: calc(100% - 4.5rem);}
    	
    	#tab1-con1{padding-bottom: 3rem;}
    	#tab1-con1,#tab1-con2{height: 100%;}
    	.aui-tab{border-bottom: solid 1px #eee;background: #f5f5f5;height: 2.25rem;}
    	.aui-tab-item{font-size: .75rem;color: #666;width: 25%;}
    	.aui-tab-item.aui-active{border:none;color: #000;position: relative;}
    	.aui-tab-item.aui-active:after{position: absolute;left: 40%;width: 20%;height: 2px;background: #00ae66;content: '';bottom:0;}
    </style>
    </head>
    <body>
        <header class="aui-bar aui-bar-nav">
            <a class="aui-pull-left aui-btn">
                <span class="aui-iconfont aui-icon-left"></span>
            </a>
            <div class="aui-title">商品</div>
            <div class="aui-pull-right"></div>
        </header>
    	<div class="aui-tab" id="tab">
    	    <div class="aui-tab-item aui-active">点菜</div>
    	    <div class="aui-tab-item">商家</div>
    	</div>
    	<div class="main">
    		<div class="aui-item" id="tab1-con1">
    			<div class="left-menu" id="left">
    				<ul>
    					<li><span>营养套餐</span></li>
    				</ul>
    			</div>
    			<div class="con">
    				<div class="right-con con-active" style="display: none;">
    					<ul>
    
    					</ul>
    				</div>
    			</div>
    			<div class="up1"></div>
    			<div class="shopcart-list fold-transition">
    				<div class="list-header">
    					<h1 class="title">购物车</h1>
    					<span class="empty">清空所有</span>
    				</div>
    				<div class="list-content">
    					<ul></ul>
    				</div>
    			</div>
    			<div class="footer">
    				<div class="left">
    					<div class="count_num"><span id="totalcountshow">0</span></div>
    					<span id="cartN" class="nowrap">总计:<span id="totalpriceshow">0</span></span> 
    				</div>
    				<div class="right">
    					<a id="btnselect" class="xhlbtn disable">去结算</a>
    				</div>
    			</div>
    		</div>
    	    <div class="aui-item aui-hide" id="tab1-con2">
    	        2
    	    </div>
    	</div>
    
    
    <script src="https://www.jq22.com/jquery/jquery-1.10.2.js"></script>
    <script type="text/javascript" src="script/add.js"></script>
    <script type="text/javascript" src="script/aui-tab.js" ></script>
    <script type="text/javascript">
    	
        apiready = function() {
            api.parseTapmode();
        }
        var tab = new auiTab({
            element: document.getElementById("tab"),
    
        }, function(ret) {
            if (ret) {
                //定义获取对象的所有兄弟节点的函数,
                function siblings(elm) {
                    var a = [];
                    var p = elm.parentNode.children;
                    for (var i = 0, pl = p.length; i < pl; i++) {
                        if (p[i] !== elm) a.push(p[i]);
                    }
                    return a;
                }
                var index = ret.index;
                var activeC = document.getElementById("tab1-con" + index);
                activeC.className = "";
                for (var i = 0; i < siblings(activeC).length; i++) {
                    siblings(activeC)[i].className = "aui-hide";
                }
            }
        });
    	
    	
    </script>
    </body>
    </html>
    
    
    
    	var ws = null;
    
    	// 菜单信息
    	var menuArr = [{"name":"珍珠奶茶","sale":"月销量:123","price":2.00,"num":0},
    				   {"name":"辣子鸡","sale":"月销量:333","price":3.00,"num":0}];
    				   
    	var shoppingCarArr = [];			   
    					   
    	function setMenu(obj){
    		menuArr.forEach((elem, index) => {
    			if(elem.name == obj.name){
    				if(obj.operation == 'add'){
    					elem.num = parseInt(elem.num) + 1;
    				}else if(obj.operation == 'remove'){
    					elem.num = parseInt(elem.num) - 1;
    				}
    				$('#num'+index ).html(parseInt(elem.num));
    				if(elem.num != 0){
    					$('.minus').css('display','inline-block');
    					$('#num'+index).css('display','inline-block');
    				}else{
    					$('.minus').css('display','none');
    					$('#num'+index).css('display','none');
    				}
    			}
    			if(obj.operation == 'clear'){
    				elem.num = 0;
    				$('.minus').css('display','none');
    				$('#num'+index).css('display','none');
    			}
    
    		});
    	}
    
    	function setShoppingCar(){
    		var totalprices = 0;
    		var totalcount = 0;
    		var delIndex;
    		delflag = false;
    		shoppingCarArr.forEach((elem, index) => {
    			flag = true;
    			$(".list-content ul li").each(function(){
    				if ($(this).find("span.accountName").html() == elem.accountName) {
    					$(this).find(".li_acount").html(parseInt(elem.num)); //对商品的数量进行重新赋值
    					$(this).find(".accountPrice").html((elem.num*elem.price).toFixed(2));//对商品的价格进行重新赋值
    					flag = false;
    					if(elem.num == 0){
    						$(this).remove();
    						delIndex = index;
    						delflag = true;
    					}
    				}
    			})
    
    			if(flag){
    				var addtr = '<li class="food">';
    				addtr += '<div><span class="accountName">'+elem.accountName+'</span></div>';
    				addtr += '<div><span></span><span class="accountPrice">'+(elem.num*elem.price).toFixed(2)+'</span></div>'	;					
    				addtr += '<div class="btn">';
    				addtr += '<button class="ms2" style="display: inline-block;"></button>';
    				addtr += '<i class="li_acount">'+elem.num+'</i>';
    				addtr += '<button class="ad2"></button>';
    				addtr += '<i class="price" style="display: none;">'+elem.price+'</i>';
    				addtr += '</div>';						
    				addtr += '</li>';						
    				$(".list-content ul").append(addtr);
    			}
    			totalprices =  (parseInt(totalprices) + (parseInt(elem.num)*parseInt(elem.price))).toFixed(2) ;
    			totalcount = parseInt(totalcount + elem.num) ;
    			if(totalcount == 0){
    				$(".up1").hide();
    			}
    			
    		});		
    		
    		if(delflag){
    			shoppingCarArr.splice(delIndex,delIndex+1); 
    		}
    		console.log(shoppingCarArr);
    		
    		
    		$("#totalpriceshow").html(totalprices); //计算当前所选总价
    	    $("#totalcountshow").html(totalcount); //计算当前总数量
    
    		if(parseFloat($("#totalcountshow").text())==0){
    			$(".shopcart-list").hide();
    		}
    		jss();   //改变按钮样式
    	}
    
    
    	// 构建菜单
    	function menu(){
    		menuArr.forEach((elem, index) => {
    			var addtr = '<li>';
    			addtr += '<div class="menu-img"><img src="image/img.jpg"></div>';
    			addtr += '<div class="menu-txt">';
    			addtr += '<h4 data-icon="'+ index +'">'+ elem.name +'</h4>';					
    			addtr += '<p class="list1">'+ elem.sale +'</p>';
    			addtr += '<p class="list2">';
    			addtr += '<b></b><b>'+ elem.price +'</b>';
    			addtr += '</p>';
    			addtr += '<div class="btn">';
    			addtr += '<button class="minus"></button>';
    			addtr += '<i id=num'+ index + '>'+ elem.num +'</i>';						
    			addtr += '<button class="add"></button>';						
    			addtr += '<i class="price">'+ elem.price +'</i>';						
    			addtr += '</div>';						
    			addtr += '</div>';						
    			addtr += '</li>';	
    			$(".right-con ul").append(addtr);
    		});		
        }
    	
    	function jss() {
            var m = $("#totalcountshow").html();
            if (m > 0) {
                $(".right").find("a").removeClass("disable");
            } else {
                $(".right").find("a").addClass("disable");
            }
        };
    	
    	
    $(function () {
    	
        $("#left li:first-child").addClass("active");
    		$(document).ready(function(){  
            // 初始化菜单
    		menu();
    		// 连接webSocket
    		webSocketTest();
        }); 
    	
    	function webSocketTest(){
    		if ("WebSocket" in window){
    		   // 打开一个 web socket
    		   ws = new WebSocket("ws://localhost:8080/ws");
    		   ws.onopen = function() {
    
    		   };
    		   ws.onmessage = function (evt){ 
    				var received_msg = evt.data;
    				var obj = JSON.parse(received_msg);
    				setMenu(obj);
    				if(obj.operation == 'add'){
    					addShoppingCar(obj.name,obj.price);
    				}else if(obj.operation == 'remove'){
    					removeShoppingCar(obj.name);
    				}else if(obj.operation == 'clear'){
    					clearShoppingCar();
    				}
    		   };
    		   ws.onclose = function(){ 
    			  alert("连接已关闭..."); 
    		   };
    		}else{
    		   alert("您的浏览器不支持 WebSocket!");
    		}
        }
    	
    	function sendMsg(name,operation,price){
    		var Obj = new Object(); 
    		Obj.name = name;
    		Obj.operation = operation; 	
    		Obj.price = price;
    		var json = JSON.stringify(Obj); 
    		ws.send(json);		
    	}
    	
    
    	function addShoppingCar(name,price){
     		var flag = true;
     		shoppingCarArr.forEach((elem, index) => {
    			if(name == elem.accountName){
    				elem.num = elem.num + 1; 
    				flag = false;
    			}
    		});	
    		if(flag){
    			var Obj = new Object(); 
    			Obj.accountName = name;
    			Obj.price = price;
    			Obj.num = 1;
    			shoppingCarArr.push(Obj);
    		}
    		setShoppingCar();
    	}
    	
    	function removeShoppingCar(name){
     		shoppingCarArr.forEach((elem, index) => {
    			if(name == elem.accountName){
    				elem.num = elem.num - 1;
    			}
    		});
    		setShoppingCar();
    	}
    	
    	function clearShoppingCar(){
    	
    		shoppingCarArr = [];
     		$(".list-content>ul").html("");
            $("#totalcountshow").text("0");
            $("#totalpriceshow").text("0");
            $(".minus").next().text("0");
            $(".minus").hide();
            $(".minus").next().hide();
            $(".shopcart-list").hide();
            $(".up1").hide();
            jss();//改变按钮样式
    		
    	}
    	
    	
    	$(document).on('click','.add',function(){
            var parent = $(this).parent();
            var m = parent.parent().children("h4").text(); //当前商品名称
    		var p = $(this).next().text(); //获取单价
    		sendMsg(m,"add",p);
        });
    	
    	$(document).on('click','.minus',function(){
            $('.shopcart-list,.up1').show();
        });
    
    	//购物车 - 加
    	$(document).on('click','.ad2',function(){
    	    var m = $(this).parent().parent().find(".accountName").text();  //当前商品名字
    		var p = parseFloat($(this).next().text());    //隐藏的价格
    		sendMsg(m,"add",p);
    	});
    	
    	//购物车 - 减
    	$('.list-content').on('click','.ms2',function(){
    		var m = $(this).parent().parent().find(".accountName").text();  //当前商品名字
    		sendMsg(m,"remove",0);
    	});
    
        //选项卡
        $(".con>div").hide();
        $(".con>div:eq(0)").show();
        $(".left-menu li").click(function(){
            $(this).addClass("active").siblings().removeClass("active");
            var n = $(".left-menu li").index(this);
            $(".left-menu li").index(this);
            $(".con>div").hide();
            $(".con>div:eq("+n+")").show();
        });
    
        $(".footer>.left").click(function(){
            var content = $(".list-content>ul").html();
            if(content!=""){
                $(".shopcart-list.fold-transition").toggle();
                $(".up1").toggle();
            }
        });
    
        $(".up1").click(function(){
            $(".up1").hide();
            $(".shopcart-list.fold-transition").hide();
        })
    	
    	//清空购物车
        $(".empty").click(function(){
    		sendMsg(0,"clear",0);
        });
    });
    
    

    实现效果

    当然要实现美团和二维火那种多人点餐还要很多逻辑,这只是最简单的demo

    在这里插入图片描述

    展开全文
  • 完成“餐厅点餐系统”的设计,餐厅点餐系统是一个适用于餐饮行业和消费者的软件,本系统初步拟定有以下模块组成:菜品管理、菜品类别管理、桌位管理、订单管理、用户管理、用户登录注册、选择菜品等。
  • Java实现的在线点餐、基于SSM+mysql的Web餐厅点餐系统实现 前台实现:用户浏览菜单、菜品分类筛选、查看菜单详情、添加购物车、情况购物车、选择餐桌结算等。 后台实现:餐系管理、菜品管理、订单管理、餐桌管理、桌...
  • 本系统分为前端和后端,前端功 能有:登录注册、修改个人信息、修改收货地址、查看商 品、加购商品、结算商品,对订单进行评价、用户留言等 功能;后端功能有:登录、商品管理、用户管理、订单管 理、留言公告管理等...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 366
精华内容 146
关键字:

java点餐结算

java 订阅