设计模式之策略模式

定义一个商场收费计算器来简单梳理策略模式

假设商场平时商品正常收费,赶上节假日,会有八折或者满300减100等优惠活动
现在定义实现一个商场收费器,来满足这些促销活动商品计算

策略模式实现

定义抽象类

用于派生出相应的优惠活动算法

public abstract class CashSuper {
    public abstract double acceptCash(double money);
}

定义具体的促销活动算法类

正常收费类

//正常收费子类
public class CashNormal extends CashSuper{
    @Override
    public double acceptCash(double money) {
        return money;
    }
}

打折促销类

//打折收费子类
public class CashRebate extends CashSuper{
    private double moneyRebate = 1d;

    public CashRebate(String moneyRebate){
        this.moneyRebate = Double.valueOf(moneyRebate);
    }

    @Override
    public double acceptCash(double money) {
        return money*moneyRebate;
    }
}

返利类

//返利收费子类
public class CashReturn extends CashSuper{
    private double moneyCondition = 0.0d;
    private double moneyReturn = 0.0d;

    public CashReturn(String moneyCondition, String moneyReturn){
        this.moneyCondition = Double.valueOf(moneyCondition);
        this.moneyReturn = Double.valueOf(moneyReturn);
    }

    @Override
    public double acceptCash(double money) {
        double result = money;
        if(money >= moneyCondition){
            result = money - Math.floor(money / moneyCondition) * moneyReturn;
        }
        return result;
    }
}

定义策略实现类

用于根据不同的促销方式,生成对应的算法策略

public class CashContext {
    private CashSuper cs;

    public CashContext(String type){
        switch (type){
            case "正常收费":
                CashNormal cashNormal = new CashNormal();
                this.cs = cashNormal;
                break;
            case "满300减100":
                CashReturn cashReturn = new CashReturn("300", "100");
                this.cs = cashReturn;
                break;
            case "打八折":
                CashRebate cashRebate = new CashRebate("0.8");
                this.cs = cashRebate;
                break;
        }
    }

    public double getResult(double money){
        return cs.acceptCash(money);
    }
}

定义业务方法验证

import java.util.Scanner;

//策略模式
public class CashCalculator {

    public static void func1(){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入单价:");
        String strA = scanner.nextLine();
        System.out.println("请输入数量:");
        String strB = scanner.nextLine();
        System.out.println("请输入算法('正常收费','打八折','满300减100'):");
        String strOper = scanner.nextLine();

        String strResult = "";
        CashContext cashContext = new CashContext(strOper);
        strResult = cashContext.getResult(Double.valueOf(strA)*Double.valueOf(strB))+"";

        System.out.println("收费结果:"+strResult);
    }

    public static void main(String[] args) {
        //策略模式+简单工厂模式
        func1();
    }
}

执行结果

请输入单价:
500
请输入数量:
10
请输入算法('正常收费','打八折','满300减100'):
满300减100
收费结果:3400.0

分析

策略模式,是一种定义了一系列算法的方法,

可以以相同的方式调用所有的算法,减少各种算法类与实现类之间的耦合度。

但不可避免的还是在算法中加入了switch方法,比如增加一种促销算法的话,还是不可避免的需要修改switch分支。

那是否有增加算法时可以使代码改动量更小的方法呢?

当然有,期待后续的反射技术,“反射反射,程序员的快乐嘛”

联系作者

微信公众号

xiaomingxiaola
(BossLiu)

QQ群

58726094


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com

×

喜欢就点赞,疼爱就打赏

日记本 网文世界