代码部分内容参考书籍:《大话设计模式_程杰》(第2章 商场促销一策略模式)
相关博客链接:https://www.cnblogs.com/cj723/
写在最前:《大话设计模式_程杰》这是一本强烈安利的书籍,对程序员学习设计模式来说,可以算得上是一本巨大的福利。通过一问一答对话的模式,由浅入深,抽丝剥茧,最终融会贯通,大道至简。
例如,在讲述曹操将“喝酒唱歌,人生真爽”改成“对酒当歌,人生几何”过程时,我感觉我是懂了…
以上截图来源于书籍《大话设计模式_程杰》
回归正题,看需求~~~(具体的分析过程,大家可以去书籍中了解。这边列出代码,仅做参考互相学习。)
1、需求
做一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。
2、效果图
2.1 “正常收费”类型
2.2 “满500返200”类型
2.3 “满500返200”类型
3、具体实现代码
目录结构:
3.1 收费抽象类CashSuper
package com.zwd.cases.demo.gof23.strategic;
/**
* @Description 收费抽象类
* @Author zhengwd
* @Date 2023/4/12 14:31
**/
public abstract class CashSuper {
public abstract double acceptCash(double money);
}
3.2 正常收费子类CashNormal
package com.zwd.cases.demo.gof23.strategic;
/**
* @Description 正常收费子类,原价返回
* @Author zhengwd
* @Date 2023/4/12 14:35
**/
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
3.3 打折收费子类CashRebate
package com.zwd.cases.demo.gof23.strategic;
/**
* @Description 打折收费子类,初始化时必须输入折扣率,如8折就是0.8
* @Author zhengwd
* @Date 2023/4/12 14:37
**/
public class CashRebate extends CashSuper {
/**
* 折扣率
*/
private double moneyRebate;
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
@Override
public double acceptCash(double money) {
return money * moneyRebate;
}
}
3.4 返利折扣子类CashReturn
package com.zwd.cases.demo.gof23.strategic;
/**
* @Description 返利折扣子类,初始化时必须输入返利条件和返利值,比如满300返100,则 moneyCondition 为300,moneyReturn 为100
* @Author zhengwd
* @Date 2023/4/12 14:43
**/
public class CashReturn extends CashSuper {
/**
*返利条件
*/
private double moneyCondition;
/**
*返利值
*/
private double moneyReturn;
public CashReturn(double moneyCondition, double moneyReturn) {
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
@Override
public double acceptCash(double money) {
double result = money;
// 当大于返利条件时,则需要减去返利值
if (money >= moneyCondition) {
result = money - Math.floor(money / moneyCondition) * moneyReturn;
}
return result;
}
}
3.5 收费工厂类CashFactory
package com.zwd.cases.demo.gof23.strategic;
/**
* @Description 收费工厂类
* @Author zhengwd
* @Date 2023/4/12 14:55
**/
public class CashFactory {
/**
* 初始化收费模式方法
* @param type
* @return
*/
public static CashSuper createCashAccept(String type) {
CashSuper cashSuper = null;
switch (type) {
case "正常收费":
cashSuper = new CashNormal();
break;
case "打5折":
cashSuper = new CashRebate(0.5);
break;
case "打8折":
cashSuper = new CashRebate(0.8);
break;
case "满300返100":
cashSuper = new CashReturn(300, 100);
break;
case "满500返200":
cashSuper = new CashReturn(500, 200);
break;
}
return cashSuper;
}
}
3.6 调用入口类Cashier
package com.zwd.cases.demo.gof23.strategic;
/**
* @Description 简单工厂模式应用举例
* 题目: 做一个商场收银软件,营业员根据客户所购买商品的单价和数量,向客户收费。
* @Author zhengwd
* @Date 2023/4/12 14:16
**/
public class Cashier {
public static void main(String[] args) {
// 结算类型:正常收费、打8折、满300返100、打5折、满500返200
String type = "正常收费";
CashFactory factory = new CashFactory();
CashSuper cashAccept = factory.createCashAccept(type);
double price = 100d;
double num = 5d;
double money = price * num;
double result = cashAccept.acceptCash(money);
System.out.println("=========结算类型:" + type);
System.out.println("=========单价:" + price);
System.out.println("=========数量:" + num);
System.out.println("=========消费金额:" + result);
}
}
完结,撒花~~~