程序设计方法与优化第八次作业

实验报告
一、设计模式类图:
简单工厂模式:
在这里插入图片描述
在这里插入图片描述
策略模式:

在这里插入图片描述
二、算法设计思路
模式设计
正常餐品都有共同的属性即价格price,因此可以采用简单工厂模式进行设计,这里设计了一个接口interface Food:
interface Food{
public double getPrice();//返回餐品价格抽象函数
}
正常餐品继承实现该接口:
class CHICKEN_WING implements Food{
double price=14;//价格
public double getPrice() {
return price;
}
}
class DRUMSTICKS implements Food{
double price=12; //价格
public double getPrice() {
return price;
}
}
class CHICKENBURGER implements Food{
double price=20; //价格
public double getPrice() {
return price;
}
}
class CHICKENROLLS implements Food{
double price=11; //价格
public double getPrice() {
return price;
}
}
class VEGETABLESOUP implements Food{
double price=5; //价格
public double getPrice() {
return price;
}
}
class CORNSALAD implements Food{
double price=5; //价格
public double getPrice() {
return price;
}
}
class CHIPS implements Food{
double price=6; //价格
public double getPrice() {
return price;
}
}
class MASH implements Food{
double price=3; //价格
public double getPrice() {
return price;
}
}
class EGGTART implements Food{
double price=4; //价格
public double getPrice() {
return price;
}
}
class ICECREAM implements Food{
double price=6; //价格
public double getPrice() {
return price;
}
}
class COLA implements Food{
double price=5; //价格
public double getPrice() {
return price;
}
}
同理基本套餐设计了接口interface Combo:
interface Combo{
public double getPrice();//返回套餐价格抽象函数
}
基本套餐继承实现接口:
套餐一:
class COMBO_FIRST implements Combo{
double price=50; //价格
public double getPrice() {
return price;
}
}
套餐二:
class COMBO_SECOND implements Combo{
double price=60; //价格
public double getPrice() {
return price;
}
}
套餐三:
class COMBO_THIRD implements Combo{
double price=80; //价格
public double getPrice() {
return price;
}
}
最后需要工厂进行生产工作,这里设计两个类FoodFactory以及ComboFactory,FoodFactory用于生产正常餐品,ComboFactory用于生产基本套餐,详细设计如下:
class FoodFactory{
public Food getFood(String params){
if(params.equals(“CHICKEN_WING”))
return new CHICKEN_WING();//生成餐品类对象
if(params.equals(“DRUMSTICKS”))
return new DRUMSTICKS();//生成餐品类对象
if(params.equals(“CHICKENBURGER”))
return new CHICKENBURGER();//生成餐品类对象
if(params.equals(“CHICKENROLLS”))
return new CHICKENROLLS();//生成餐品类对象
if(params.equals(“VEGETABLESOUP”))
return new VEGETABLESOUP();//生成餐品类对象
if(params.equals(“CORNSALAD”))
return new CORNSALAD();//生成餐品类对象
if(params.equals(“CHIPS”))
return new CHIPS();//生成餐品类对
if(params.equals(“MASH”))
return new MASH();//生成餐品类对象
if(params.equals(“EGGTART”))
return new EGGTART();//生成餐品类对象
if(params.equals(“ICECREAM”))
return new ICECREAM();//生成餐品类对象
if(params.equals(“COLA”))
return new COLA();//生成餐品类对象
return null;
}
}
class ComboFactory{
public Combo getCombo(String params){
if(params.equals(“COMBO_FIRST”))
return new COMBO_FIRST();//生成套餐类对象
if(params.equals(“COMBO_SECOND”))
return new COMBO_SECOND();//生成套餐类对象
if(params.equals(“COMBO_THIRD”))
return new COMBO_THIRD();//生成套餐类对象
return null;
}
}
对于该系统的以优惠券购买餐品,可以采用策略模式进行设计,不同的优惠方案就是不同的策略的具体体现,这里设计了接口interface Discount:
interface Discount{
public double calprice(double organicPrice);
}
不同的优惠方案作为子类继承实现该接口:
class Discount_first implements Discount{
public double calprice(double organicPrice) {
return organicPrice0.9;//9折优惠操作
}
}
class Discount_second implements Discount{
public double calprice(double organicPrice) {
return organicPrice-10;//10元优惠操作
}
}
class Discount_third implements Discount{
public double calprice(double organicPrice) {
return organicPrice
0.8;//8折优惠操作
}
}
正常餐品的结算和找零:
当客户进行结算时,只有当客户所购买的餐品数目不为零时进行正常结算,通过FoodFactory生产餐品:
if(temp>0){

//指向由工厂生产的餐品子类对象
food=foodfactory.getFood(“CHICKEN_WING”);
sale_of_CHICKEN_WING+=temp;// 计算该类餐品消费总数
sum+=temp*food.getPrice();//总消费加上该类餐品消费金额
}
其它餐品同理。
找零时,分两种情况,一种是普通找零,另一种是会员找零,会员找零设计了会员类Member,丙通过文件存储会员信息:
class Member{
static int sign=0;
int id;//会员id
int money;//会员余额
//构造方法,初始化会员对象
public Member(int sign){
this.sign++;
this.id=sign;
money=100;
}
//构造方法,初始化会员对象
public Member(int sign,int money){
this.sign++;
this.id=sign;
this.money=money;
}
//会员充值
public void add_money(int money){
this.money+=money;
}
//会员进行消费
public void consume(int money){
this.money-=money;
}
}
基本套餐的结算和找零同理。
使用优惠券购买餐品结算和找零:
在找零的界面中可以通过下拉框组件选择相应的优惠券,选定某一个优惠券后,让策略模式中的discount基类对象指向对应的优惠子类对象,并调用方法calprice进行优惠。结算金额也会随之变化为优惠后的金额:
if(“9折优惠券”.equals(item_choose)){
//策略模式中的discount基类对象指向对应的优惠子类对象
discount=new Discount_first();
sum=discount.calprice(sum);//调用子类实现的函数进行优惠
label_sum.setText(“应收金额:”+String.valueOf(sum));
}
if(“10元优惠券”.equals(item_choose)){
//策略模式中的discount基类对象指向对应的优惠子类对象
discount=new Discount_second();
sum=discount.calprice(sum); //调用子类实现的函数进行优惠
label_sum.setText(“应收金额:”+String.valueOf(sum));
}
if(“8折优惠券”.equals(item_choose)){
//策略模式中的discount基类对象指向对应的优惠子类对象
discount=new Discount_third();
sum=discount.calprice(sum); //调用子类实现的函数进行优惠
label_sum.setText(“应收金额:”+String.valueOf(sum));
}
可在一定时间段参与店内活动:
这里采取的是每日优惠方案,即一周每天都有优惠,但每天优惠的餐品不同,首先获取当天是周几,再通过一个标签组件显示优惠信息,同时对应餐品的价格下调。
模拟打印小票:
当找零成功后,将客户购买餐品的信息以及总消费金额输出到文件中。
界面设计以及数据库连接:
可视化界面采用了Java Swing以及awt进行设计,数据库记录采用了JDBC并连接mysql来实现,因为要实现当天的数据统计,即数据会在当天结束后自动进行记录,设计如下,最后在main函数中通过new TImeManager();来实现自动记录:
class Task extends TimerTask {
static Connection conn=null;
static Statement stmt=null;
static ResultSet rs=null;
public void run() {
try{
String url = “jdbc:mysql://localhost:3306/jdbc?serverTimezone=GMT%2B8”;//系统时间需要改正
String username=“hjc”;
String password=“2570090473”;
conn=DriverManager.getConnection(url,username,password);
stmt=conn.createStatement();
String sql=“insert into account(sale_of_CHICKEN_WING,sale_of_DRUMSTICKS,sale_of_CHICKENBURGER,sale_of_CHICKENROLLS,sale_of_VEGETABLESOUP,sale_of_CORNSALAD,sale_of_CHIPS,sale_of_MASH,sale_of_EGGTART,sale_of_ICECREAM,sale_of_COLA,sale_of_COMBO_FIRST,sale_of_COMBO_SECOND,sale_of_COMBO_THIRD,sum_money)”+“values(sale_of_CHICKEN_WING,sale_of_DRUMSTICKS,sale_of_CHICKENBURGER,sale_of_CHICKENROLLS,sale_of_VEGETABLESOUP,sale_of_CORNSALAD,sale_of_CHIPS,sale_of_MASH,sale_of_EGGTART,sale_of_ICECREAM,sale_of_COLA,sale_of_COMBO_FIRST,sale_of_COMBO_SECOND,sale_of_COMBO_THIRD,sum_money)”;
stmt.executeUpdate(sql);
}
catch(Exception e){
e.printStackTrace();
}
}
}
/**

  • 任务管理
  • @author admin_Hzw

*/
class TimerManager {

/** 
 * @param args 
 */  
//时间间隔(一天)  
private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;  
public TimerManager() {  
    Calendar calendar = Calendar.getInstance();  
    calendar.set(Calendar.HOUR_OF_DAY, 1); //凌晨1点  
    calendar.set(Calendar.MINUTE, 0);  
    calendar.set(Calendar.SECOND, 0);  
    Date date=calendar.getTime(); //第一次执行定时任务的时间  
    //如果第一次执行定时任务的时间 小于当前的时间  
    //此时要在 第一次执行定时任务的时间加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。  
    if (date.before(new Date())) {  
        date = this.addDay(date, 1);  
    }  
    Timer timer = new Timer();  
    Task task = new Task();  
    //安排指定的任务在指定的时间开始进行重复的固定延迟执行。  
    timer.schedule(task,date,PERIOD_DAY);    
}  
// 增加或减少天数  
public Date addDay(Date date, int num) {  
    Calendar startDT = Calendar.getInstance();  
    startDT.setTime(date);  
    startDT.add(Calendar.DAY_OF_MONTH, num);  
    return startDT.getTime();  
}  

}
三、调试及测试截屏:
程序运行主界面:
在这里插入图片描述
一、基本餐品结算功能:
1、选择餐品:
在这里插入图片描述
2、选择找零方式:
在这里插入图片描述

3、普通找零:
在这里插入图片描述
4、找零成功:
在这里插入图片描述
5、会员找零:
在这里插入图片描述
6、找零成功:
在这里插入图片描述
二、基本套餐结算和找零:

1、选择套餐进行结算并选择优惠券:
在这里插入图片描述
2、普通找零:
在这里插入图片描述
3、成功找零:
在这里插入图片描述
4、会员找零:
在这里插入图片描述
5、输入会员id并找零:
在这里插入图片描述
三、会员办理,点击主界面的办理会员按钮:
在这里插入图片描述
四、会员充值,输入要充值的会员id以及充值面额:
在这里插入图片描述
四、总结:
通过本次作业,我加深了对设计模式的理解与使用,设计模式的选择如果恰当,将起到事半功倍的作用,犹如建房的地基,地基越牢固,楼房抗干扰能力越强,越是能应对各种问题,因此掌握常用的设计模式是非常有必要的。这次的作业让我明白数据结构的重要性,设计模式可以说是数据结构的另一种表现形式,可见数据结构的重要性。加强数据结构的学习是很重要的一件事,在设计的过程中,我发现自己对基本概念的理解还不够深刻,学习不能浅尝辄止,这要引起重视。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值