2.策略模式

商场实现打折促销

0.UML图

1.抽象类,定义所有支持的打折促销方式算法的公共接口

/**
 * @author makex
 * @note 打折抽象类,定义所有支持的算法公共接口
 * @create 2017-06-12
 */
public abstract class CashSuper {

    public abstract double accepptCash(double money);
}

2.下面三个子类具体实现打折促销算法

/**
 * @author makex
 * @note 正常收费子类
 * @create 2017-06-12
 */
public class CashNomal extends CashSuper {
    @Override
    public double accepptCash(double money) {
        return money;
    }
}
/**
 * @author makex
 * @note 打折收费子类
 * @create 2017-06-12
 */
public class CashRebate extends CashSuper {
    private double moneyrebate = 1d;

    public CashRebate(double moneyrebate) {
        this.moneyrebate = moneyrebate;
    }

    @Override
    public double accepptCash(double money) {
        return this.moneyrebate * money;
    }
}

/**
 * @author makex
 * @note 返利收费子类
 * @create 2017-06-12
 */
public class CashReturn extends CashSuper {
    private double moneyCondition  = 0.0d;
    private double moneyReturn = 0.0d;

    public CashReturn(double moneyCondition, double moneyReturn) {
        this.moneyCondition = moneyCondition;
        this.moneyReturn = moneyReturn;
    }

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

        return money;
    }
}

3.使用一个Context来配置策略,维护一个对打折促销子类对象的引用

/**
 * @author makex
 * @note 配置ContextStrategy,维护一个对Strategy对象的引用
 * @create 2017-06-12
 */
public class CashContext {
    private CashSuper cashSuper;

    public CashContext(CashSuper cashSuper) {
        this.cashSuper = cashSuper;
    }

    public double getResult(double monney){
        return cashSuper.accepptCash(monney);
    }
}

4.测试类

/**
 * @author makex
 * @note 策略模式测试类
 * @create 2017-06-12
 */
public class TestClass {
    public static void main(String[] args) {
        CashContext context = new CashContext(new CashNomal());
        context.getResult(100);
        System.out.println("正常收费:"+context.getResult(100));

        context = new CashContext(new CashRebate(0.8));
        context.getResult(100);
        System.out.println("打8折:"+context.getResult(100));

        context = new CashContext(new CashReturn(300,100));
        context.getResult(300);
        System.out.println("满300返100:"+context.getResult(300));

    }
}
posted @ 2017-06-12 16:29  桃源仙居  阅读(137)  评论(0)    收藏  举报