(参考大话设计模式 程杰著)
在上一篇中,介绍了简单工厂模式,可以借今天的问题先回顾一下工厂模式。
问题:做一个商场收银软件,营业员根据客户购买的单价和数量,向客户收费。如图:
你可能会想到,将前端界面写好,form表单提交给后端处理,返回给前端即可。的确,但是现在商场的营销策略变了,今天要打八折,明天要满300返100促销。由此,想让你用简单工厂来实现。
一、简单工厂实现
思路:不管是正常价格,打几折,还是返钱都可以看作是一种收钱方法。由此你可以想到可以把收钱方法抽象出来到父类,子类实现不同的收钱方法,再通过一个工厂,根据前端下拉框的内容来判断new什么子类对象,再通过多态调用某个具体的方法返回money,带到前端界面显示即可。下面是具体代码:
1.CashSuper类:
package com.shou.simplefactory.servlet;
//收费父类
abstract class CashSuper {
public abstract double acceptCash(double money);
}
2.CashNormal类:
package com.shou.simplefactory.servlet;
//正常收费子类
public class CashNormal extends CashSuper{
@Override
public double acceptCash(double money) {
return money;
}
}
3.CashRebate类:
package com.shou.simplefactory.servlet;
//打折收费子类
public class CashRebate extends CashSuper{
private double moneyRebate=1d;
public CashRebate() {
}
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
}
4.CashReturn类:
package com.shou.simplefactory.servlet;
//返利收费子类
public class CashReturn extends CashSuper{
private double moneyCondition=0.0d;
private double moneyReturn=0.0d;
public CashReturn() {
}
public CashReturn(double moneyCondition, double moneyReturn) {
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
@Override
public double acceptCash(double money) {
if (money>=moneyCondition){
money=money-Math.floor(money/moneyCondition)*moneyReturn;
}
return money;
}
}
5.工厂类CashFactory(关键):
package com.shou.simplefactory.servlet;
public class CashFactory {
public static CashSuper createCashAccept(String str){
CashSuper cashSuper=null;
switch (str){
case "正常收费":
cashSuper=new CashNormal();
break;
case "打八折":
cashSuper=new CashRebate(0.8);
break;
case "满300返100":
cashSuper=new CashReturn(300,100);
break;
}
return cashSuper;
}
}
6.前端界面:
index2.jsp:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2024/1/25
Time: 0:46
To change this template use