【设计模式】策略模式

本例中描述了三种商场促销的方式

类图

此图结合了策略模式和简单工厂,单纯的策略模式不需要在CashContext中生成具体策略的对象,可以作为构造函数的参数传入即可

在这里插入图片描述

工程目录

在这里插入图片描述

代码

AbstractCash.java

package com.company.pattern.demo02;

/**
 * AbstractCash是抽象的策略,它的实现类是具体的策略
 * @author blazar
 */
public abstract class AbstractCash {
    /**
     * 现金收取抽象类的抽象方法,收取现金,参数为原件,返回为当前价格
     * @param money
     * @return
     */
    public abstract double acceptCash(double money);
}

CashNormal.java

package com.company.pattern.demo02;

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

CashRebate.java

package com.company.pattern.demo02;

/**
 * 打折收费子类
 * @author blazar
 */
public class CashRebate extends AbstractCash{
    private double moneyRebate;

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

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

CashReturn.java

package com.company.pattern.demo02;

/**
 * 返利收费子类(比如:满300返100)
 * @author blazar
 */
public class CashReturn extends AbstractCash{
    private double moneyCondition;
    private double moneyReturn;

    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;
    }
}

CashContext.java

package com.company.pattern.demo02;

/**
 * @author blazar
 */
public class CashContext {
    private AbstractCash cash;

    /**
     * 根据传入字符串,创建对应的收费对象
     * @param type 表示收费类型
     */
    public CashContext(String type){
        /**
         * 将实例化具体策略的过程放到了简单工厂中
         */
        switch(type){
            case "正常收费":
                cash = new CashNormal();
                break;
            case "满300返100":
                cash = new CashReturn("300","100");
                break;
            case "打8折":
                cash = new CashRebate("0.8");
                break;
        }
    }

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

Main.java

package com.company.pattern.demo02;

/**
 * @author blazar
 */
public class Main {
    /**
     * 策略模式
     */
    public static void main(String[] args) {
        CashContext cashContext = new CashContext("打8折");
        System.out.println(cashContext.getResult(300));
    }
}

变化点

修改

修改具体策略的实现类即可;

增加

如果需要增加具体策略,需要两步骤:先增加具体策略的实现类;然后在简单工厂中增加switch;

参考《大话设计模式》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值