策略模式以及与简单工厂模式的结合

(参考大话设计模式 程杰著)
在上一篇中,介绍了简单工厂模式,可以借今天的问题先回顾一下工厂模式。

问题:做一个商场收银软件,营业员根据客户购买的单价和数量,向客户收费。如图:在这里插入图片描述

你可能会想到,将前端界面写好,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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值