KFC点餐收银系统

一.实验内容

同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,合理使用C++或Java或Python结合设计模式(2种以上)至少实现系统的以下功能:

1.正常餐品结算和找零。

2.基本套餐结算和找零。

3.使用优惠劵购买餐品结算和找零。

4.可在一定时间段参与店内活动(自行设计或参考官网信息)。

5.模拟打印小票的功能(写到文件中)。

二.题目分析及类图设计

策略模式

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;需要安全地封装多种同一类型的操作时; 出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。

抽象策略角色: 策略类,通常由一个接口或者抽象类实现。

具体策略角色:包装了相关的算法和行为。

环境角色:持有一个策略类的引用,最终给客户端调用。

优点:策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码;提供了可以替换继承关系的办法。继承可以处理多种算法或行为;避免使用多重条件转移语句。缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类;策略模式造成很多的策略类,每个具体策略类都会产生一个新类。

问题分析

首先建立一个抽象食物类AbstractFood,里面包含每种食物最基本的价格、数量等,还包含实现Huodong接口的打折函数YPrice();抽象角色为接口Food,可打印相关食物具体信息;抽象具体角色分别为HamburgDrinkOtherFood实现Food接口;建立接口KFCFactory为抽象工厂,实现抽象工厂的具体接口为Kfactory,返回到具体食物类。套餐分别建立抽象角色DrinkkOtherHam,Customer类中实例化抽象工厂和抽象角色,选取不同具体角色组成套餐。不同方式结算时采用策略模式,Huodong为抽象策略类含YPrice()函数,ActivityJianjia为具体策略类分别为不同减价模式;HighPrice为环境角色,含有成员变量,在Customer类中调用。

类图设计

自主点餐

KFC点餐收银系统

策略模式:付款方式类图设计

KFC点餐收银系统

.运行截图

自主点餐

KFC点餐收银系统

选择套餐

KFC点餐收银系统

.总结

    将几种设计模式结合有一定的难度,代码主要参考于https://blog.csdn.net/baidu_38634843/article/details/83419802。主要难度在于实现不同付款方式的策略模式与其他模式的结合和Customer类的编写,要在全局的视野下新建类、进行继承、实现接口等。代码也不是很完善如:无法进行连续的点餐。

五.部分代码

付款方式

KFC点餐收银系统

抽象食物:AbstractFood同时实现接口Huodong

public   abstract class AbstractFood  implements Huodong{

    public double price;  

    public int num;

    public  String kind;      

    public double Price() {       

        return this.price*this.num;   

        }

    public double YPrice(double foodPrice) {     

        return this.price*this.num;   

        }  

}

接口:Food,打印输出不同食品信息

public interface Food {

    public void printMessage();

}

套餐汉堡、饮品、其他食物抽象基类

public abstract class Hamburg extends AbstractFood implements Food{

    public void printMessage() {

        System.out.println(this.kind+"汉堡:\n"+"单价:"+this.price+"\n"+"数量:"+this.num+"\n");

    }

}

单品汉堡、饮品、其他食物类

public  class Drinkk extends AbstractFood implements Food{

    public void printMessage() {

        System.out.println(this.kind+"饮品:\n"+"单价:"+this.price+"\n"+"数量:"+this.num+"\n"+"合计 "+Price());

    }

     public void Cola(int num) {

           this.kind="百事可乐";

           this.price=8.0;

           this.num=num;}

     public void  Coffee(int num) {

           this.kind="手磨咖啡";

           this.price=15.0;

           this.num=num;}

}

具体食物角色:OneHamburgTwoHamburgCoffeeColaIceChickenwings

public class Chickenwings extends Otherfood{

    public  Chickenwings(int num) {

        this.kind = "奥尔良烤翅";

        this.price =18.0;

        this.num = num;}

}

抽象工厂:KFCFactory

public interface KFCFactory {

    //生产汉堡

    public OneHamburg creatOneHamburg(int num);

    public TwoHamburg creatTwoHamburg(int num);

    //生产饮料

    public Coffee creatCoffee(int num);

    public Cola creatCola(int num);

    //生产其他食物

    public Chickenwings creatChickenwings(int num);

    public Ice creatIce(int num);

}

具体工厂:Kfactory

public class Kfactory implements KFCFactory{

    public OneHamburg creatOneHamburg(int num) {

    return new OneHamburg(num);

    }

    public TwoHamburg creatTwoHamburg(int num){

        return new TwoHamburg(num);

        }  

    public Coffee creatCoffee(int num){

        return new Coffee(num);

        }

    public Cola creatCola(int num){

        return new Cola(num);

        }

    public Chickenwings creatChickenwings(int num){

        return new Chickenwings(num);

        }

    public Ice creatIce(int num) {

        return new Ice(num);

    }

}

策略模式

接口:Huodong

public abstract interface Huodong {

    public abstract double YPrice(double foodPrice);

}

实现类:

Activity:实现将食物价格打九折

Jianjia:实现将食物价格减五元

HighPrice

public class HighPrice {

    private Huodong huo;

    private Huodong huo1;

    public HighPrice(Huodong huo) {

        this.huo=huo;

        this.huo1=huo1;

    }

   public double quote(double foodPrice) {

       return this.huo.YPrice(foodPrice);

   }

}