1. 程式人生 > >策略模式結合簡單工廠模式

策略模式結合簡單工廠模式

簡單工廠模式 program 多少 spa type 滿足 cond out 策略模式

概述

策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方式調用所有的算法,減少各種算法類與使用算法類之間的耦合。

場景

超市收營員收錢,有打幾折、滿多少返現、正常收費等活動來最終算出客戶應該付多少現金。

1.現金收款超類

package com.gzy.designpattern.strategyandfactory;

/*
 * @program: mybatis-plus
 * @description: 現金收款超類
 * @author: gaozhiyuan
 * @create: 2019-02-13 23:23
 */
 interface
CashSuper { double acceptMoney(double money); }

2.正常收費

package com.gzy.designpattern.strategyandfactory;

/*
 * @program: mybatis-plus
 * @description: normal accept money
 * @author: gaozhiyuan
 * @create: 2019-02-13 23:30
 */
public class CashNormal implements CashSuper {
    @Override
    public
double acceptMoney(double money) { return money; } }

3.打折

package com.gzy.designpattern.strategyandfactory;

/*
 * @program: mybatis-plus
 * @description: rebate accept money
 * @author: gaozhiyuan
 * @create: 2019-02-13 23:31
 */
 class CashRebate  implements  CashSuper{
    private double
rebate; public CashRebate() { } public CashRebate(double rebate) { this.rebate = rebate; } @Override public double acceptMoney(double money) { return money*this.rebate; } }

4.滿多少返現

package com.gzy.designpattern.strategyandfactory;

/*
 * @program: mybatis-plus
 * @description: 返現
 * @author: gaozhiyuan
 * @create: 2019-02-13 23:34
 */
public class CashReturn implements CashSuper {
    //滿足的條件
    private double moneyCondition;
    //返現金額
    private double moneyReturn;

    public CashReturn() {
    }

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

    @Override
    public double acceptMoney(double money) {
        double result = money;
        if(money >= this.moneyCondition){
            result = money - this.moneyReturn;
        }
        return result;
    }
}

5.策略模式結合簡單工廠類,可根據傳入活動類型寫死活動內容,也可通過不同的構造函數確定活動。

package com.gzy.designpattern.strategyandfactory;

/*
 * @program: mybatis-plus
 * @description:
 * @author: gaozhiyuan
 * @create: 2019-02-13 23:40
 */
public class CashContext {
      CashSuper cashSuper;

    public CashContext(String type) {//傳入打折或返現類型
        switch (type) {
            case "normal":
                cashSuper = new CashNormal();
                break;
            case "rebate":
                cashSuper = new CashRebate(0.8);
                break;
            case "return":
                cashSuper = new CashReturn(300,100);
                break;
        }
        this.cashSuper = cashSuper;
    }

    public CashContext(){
        cashSuper = new CashNormal();
    }

    public CashContext(double rebate){
        cashSuper = new CashRebate(rebate);
    }

    public CashContext(double moneyCondition,double moneyReturn){
        cashSuper = new CashReturn(moneyCondition,moneyReturn);
    }

    public double acceptMoney(double money){
        return  cashSuper.acceptMoney(money);
    }
}

6,測試類

package com.gzy.designpattern.strategyandfactory;

/*
 * @program: mybatis-plus
 * @description: test
 * @author: gaozhiyuan
 * @create: 2019-02-13 23:56
 */
public class Test {
    public static void main(String[] args) {
        CashContext cashContext = new CashContext(300,100);
    //    CashContext cashContext = new CashContext(0.8);
    //    CashContext cashContext = new CashContext();
        double result = cashContext.acceptMoney(1000); //根據活動算出最終該付多少錢
        System.out.println(result); //
    }
}

測試結果

900.0

Process finished with exit code 0

策略模式結合簡單工廠模式